Scala 如何在spark中不进行排序就获得top-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

在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)
但我想知道,有没有更好的解决方案可以避免排序呢?

我想你会想要的

返回此RDD中由定义的前k个(最小)元素 指定的隐式排序[T]并保持排序

返回此RDD中由 指定隐式排序[T]


还有一些其他的SO问题/答案看起来至少部分重复了

,无法根据某个值获得顶部,那么您必须在某个地方排序。如果您想提高速度,可以使用blinkdbthough@JustinPihony那不是真的。不必对所有内容进行排序就可以得到top-n(基本上是因为不需要对不在top-n中的内容进行排序)。看见