2015-12-16 40 views
2

我想要做的是这样的: http://cn.mathworks.com/help/matlab/ref/median.html?requestedDomain=www.mathworks.com 找到每列的中值。 这可以通过将RDD收集到驱动程序来完成,以获得一个不可能的大数据。 我知道Statistics.colStats()可以计算均值,方差...但不包括中位数。 此外,矢量是高维和稀疏的。如何高效地计算Spark中RDD [org.apache.spark.mllib.linalg.Vector]的中值?

+0

我收集RDD给驱动程序,然后计算它。 – guxiang

+0

@guxiang那个方法很麻烦,因为有些数据集不适合只有一台电脑 –

+0

@guxiang什么矢量?你能告诉我们吗? –

回答

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) 

关键是你的dataset使用sortBy进行排序,然后用拉链的条目他们的索引使用zipWithIndex然后得到中间的条目,请注意,为了简单起见,我设置了奇数个样本,但其实质是存在的,除此之外,您必须对数据集的每一列执行此操作。

+1

“诀窍是使用sortBy对数据集进行排序,”sloooow。有更快的算法,但它们仍然是O(N)。另外,在OP的例子中,他每行最多有400个条目,这意味着排序400次 –

+0

@ TheArchetypalPaul我在我的回答“我敢打赌,有更好的”我说,我希望有人发布他们,所以我可以学习:) –

相关问题