2015-12-16 74 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我在我的回答「我敢打賭,有更好的」我說,我希望有人發佈他們,所以我可以學習:) –

相關問題