Scala 如何高效地计算spark中RDD[org.apache.spark.mllib.linalg.Vector]的中值?

Scala 如何高效地计算spark中RDD[org.apache.spark.mllib.linalg.Vector]的中值?,scala,apache-spark,median,Scala,Apache Spark,Median,我想这样做: 找到每列的中值。 这可以通过收集RDD到驱动程序来完成,因为大数据将变得不可能。 我知道统计学。colStats()可以计算均值、方差。。。但中位数不包括在内。 此外,向量是高维且稀疏的。我不理解向量部分,但这是我的方法(我打赌有更好的方法): 诀窍是使用sortBy对dataset进行排序,然后使用zipWithIndex对条目及其索引进行压缩,然后得到中间的条目,请注意,为了简单起见,我设置了奇数个样本,但本质是这样的,此外,您还必须对数据集的每一列执行此操作。我将RDD收集到

我想这样做: 找到每列的中值。 这可以通过收集RDD到驱动程序来完成,因为大数据将变得不可能。 我知道统计学。colStats()可以计算均值、方差。。。但中位数不包括在内。
此外,向量是高维且稀疏的。

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


诀窍是使用
sortBy
dataset
进行排序,然后使用
zipWithIndex
对条目及其索引进行压缩,然后得到中间的条目,请注意,为了简单起见,我设置了奇数个样本,但本质是这样的,此外,您还必须对数据集的每一列执行此操作。

我将RDD收集到驱动程序中,然后进行计算。@guxiang这种方法很麻烦,因为有些数据集不能只容纳一列computer@guxiang什么向量?您能告诉我们吗?您的问题(以及colStats不包括中值的原因)是中值需要迭代每个值(最后一个值可以更改结果)。所以它不适合Spark或任何并行计算。你确定你真的需要中位数吗?@Albertobonsanto向量是这样的:“诀窍是使用sortBy对数据集进行排序,”Slooow说。有更快的算法,但它们仍然是O(N)。此外,在OP的示例中,他每行最多有400个条目,这意味着排序为400times@TheArchetypalPaul好吧,我在回答中说“我打赌会有更好的”,我希望有人发布它们,这样我就可以了解:)这里有2021年的新闻,没有火花或MLLIB?
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)