2016年9月8日星期四

spark中dbscan使用中遇到的问题

Spark中目前没有集成dbscan聚类算法,见https://issues.apache.org/jira/browse/SPARK-5226

找了三个项目:
1、https://github.com/scalanlp/nak
nak中dbscan的输入必须是一个breeze.linalg.DenseMatrix的矩阵包含了所有数据,并不是我所需要的RDD[Vector],不可用。

2、https://github.com/irvingc/dbscan-on-spark
输入是一个RDD[Vector],但代码中只考虑了Vector的前两个值,所以该项目只能计算二维的dbscan,需要自己修改代码支持多维的Vector。

因为我用的Spark 2.0.0,而这个项目用的1.6.1,org.apache.spark.Logging类不存在了,我改为了org.apache.spark.internal.Logging。

运行时又遇到另外一个bug:
java.lang.NoSuchMethodError: scala.collection.immutable.$colon$colon.hd$1()Ljava/lang/Object;
看了一下代码,不知道为什么运行时不支持EvenSplitPartitioner.scala文件中的case (rectangle, count) :: rest => 这种List的写法,所以我将这段改为了获取List的head和tail,重新编译,提交spark运行,终于成功。

另外,该项目的repo中没有最新版本的jar,所以只能通过源码进行打包。

3、https://github.com/alitouka/spark_dbscan
目前只支持csv格式的文件作为输入,每行用逗号隔开。
同样,该项目是基于Spark 1.1.0写的,修改为2.0.0时要删去Logging类。

看了一下代码,如果不用IOHelper.readDataset方法,可以直接将数据转为RDD[Point]后进行计算。

运行了一下,发现vector维度为10000时候小数据量就报错,维度1000时大数据量也会出错,该问题目前还没有解决。

1 条评论: