Scala 如何在spark中不进行排序就获得top-k频繁词?
在spark中,我们可以很容易地使用map reduce计算单词出现时间,并使用sort获得前k个频繁单词Scala 如何在spark中不进行排序就获得top-k频繁词?,scala,apache-spark,Scala,Apache Spark,在spark中,我们可以很容易地使用map reduce计算单词出现时间,并使用sort获得前k个频繁单词 // Sort locally inside node, keep only top-k results, // no network communication val partialTopK = wordCount.mapPartitions(it => { val a = it.toArray a.sortBy(-_._2).take(10).iterator
// Sort locally inside node, keep only top-k results,
// no network communication
val partialTopK = wordCount.mapPartitions(it => {
val a = it.toArray
a.sortBy(-_._2).take(10).iterator
}, true)
// Collect local top-k results, faster than the naive solution
val collectedTopK = partialTopK.collect
collectedTopK.size
// Compute global top-k at master,
// no communication, everything done on the master node
val topK = collectedTopK.sortBy(-_._2).take(10)
但我想知道,有没有更好的解决方案可以避免排序呢?我想你会想要的
返回此RDD中由定义的前k个(最小)元素
指定的隐式排序[T]并保持排序
或
返回此RDD中由
指定隐式排序[T]
还有一些其他的SO问题/答案看起来至少部分重复了,无法根据某个值获得顶部,那么您必须在某个地方排序。如果您想提高速度,可以使用blinkdbthough@JustinPihony那不是真的。不必对所有内容进行排序就可以得到top-n(基本上是因为不需要对不在top-n中的内容进行排序)。看见