如何有效地计算Spark中RDD [org.apache.spark.mllib.linalg.Vector]的中位数?

时间:2015-12-16 11:05:25

标签: scala apache-spark median

我想这样做: http://cn.mathworks.com/help/matlab/ref/median.html?requestedDomain=www.mathworks.com 找到每列的中值。 它可以通过将RDD收集到驱动程序来完成,以获取无法实现的大数据。 我知道Statistics.colStats()可以计算均值,方差......但不包括中位数。 此外,矢量是高维和稀疏的。

1 个答案:

答案 0 :(得分:0)

嗯,我不理解矢量部分,但这是我的方法(我打赌有更好的方法):

val a = sc.parallelize(Seq(1, 2, -1, 12, 3, 0, 3))
val n = a.count() / 2

println(n) // outputs 3

val b = a.sortBy(x => x).zipWithIndex()
val median = b.filter(x => x._2 == n).collect()(0)._1  // this part doesn't look nice, I hope someone tells me how to improve it, maybe zero?

println(median) // outputs 2
b.collect().foreach(println) // (-1,0) (0,1) (1,2) (2,3) (3,4) (3,5) (12,6)  

诀窍是使用datasetsortBy进行排序,然后使用zipWithIndex使用索引压缩条目,然后获取中间条目,请注意我设置了奇数个样本,为简单起见,但本质就在那里,除此之外,您必须对数据集的每一列执行此操作。