Apache Spark如何实现其topK()API?

xua*_*yue 4 apache-spark

在Apache Spark中有一个RDD.top()API,可以从RDD 返回前k个元素.我想知道这些操作是如何实现的.首先对RDD进行排序然后返回前k个值吗?或者它是否使用其他更有效的实现?

van*_*jar 7

不,它不会对整个RDD进行排序,操作会太昂贵.

它宁愿使用优先级队列分别为每个分区选择TOP N个元素.然后在reduce操作中将这些队列合并在一起.这意味着只有整个RDD的一小部分在整个网络中进行混洗.

有关RDD.scala详细信息,请参阅

示例:

3个输入分区
RDD.top(2)

[3, 5, 7, 10], [8, 6, 4, 12], [9, 1, 2, 11]
      ||            ||              || 
   [10, 7]        [12, 8]         [11, 9]
================== reduce ==================
                 [12, 11]
Run Code Online (Sandbox Code Playgroud)