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