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