roc*_*kme 2 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
}, 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)
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有更好的解决方案,根本避免排序?
我想你要 takeOrdered
根据指定的隐式Ordering [T]定义,从此RDD返回前k个(最小)元素,并保持该顺序。
要么 top
根据指定的隐式Ordering [T]返回此RDD中的前k个(最大)元素。
还有其他一些SO问题/答案似乎也至少部分重复