Apache spark ApacheSpark是如何实现其topK()API的?

Apache spark ApacheSpark是如何实现其topK()API的?,apache-spark,Apache Spark,在ApacheSpark中有一个,它可以从RDD返回前k个元素。我想知道这项行动是如何实施的。它是否先对RDD进行排序,然后返回前k个值?或者它是否使用了其他更高效的实现?不,它不会对整个RDD进行排序,这样的操作成本太高 它宁愿使用优先级队列为每个分区分别选择前N个元素。然后在reduce操作中将这些队列合并在一起。这意味着整个RDD中只有一小部分在网络中被洗牌 有关更多详细信息,请参阅 示例: 3个输入分区 RDD.top(2) top对类型a的操作形成一个monoid,给定某种排序。我不知

在ApacheSpark中有一个,它可以从RDD返回前k个元素。我想知道这项行动是如何实施的。它是否先对RDD进行排序,然后返回前k个值?或者它是否使用了其他更高效的实现?

不,它不会对整个RDD进行排序,这样的操作成本太高

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

有关更多详细信息,请参阅

示例

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


top
对类型
a
的操作形成一个
monoid
,给定某种排序。我不知道具体的实现细节,但这是我想象的想法。我必须补充一点,这并不能给出准确的结果。假设我们有像
[1:3,2:4,3:4]
[1:3,3:6,4:5]
这样的分区,每个entry的格式是
id:frequency
。现在对于
top(2)
我们有两个列表
[2:4,3:4]
[3:6,4:5]
用于每个
本地top(2)
,最终结果是
[3:10,4:5]
,而正确的结果应该是
[1:6,3:10]
[3, 5, 7, 10], [8, 6, 4, 12], [9, 1, 2, 11]
      ||            ||              || 
   [10, 7]        [12, 8]         [11, 9]
================== reduce ==================
                 [12, 11]