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

时间:2015-07-31 11:38:09

标签: apache-spark

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

1 个答案:

答案 0 :(得分: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]