Action算子: count ,top,take,takeorder算子
count算子 统计rdd中元素的个数
它是一个action算子,把每个分区的个数统计完之后用runjob发送到driver端,然后在driver端进行sum操作。

top算子是一个action算子(返回前num个数据,这是从大到小排好序的前num个)
这里要重点说明一下,你在调用top算子的时候传入的排序规则,最后得到的结果是和你传入的相反的。
这里的ord.reverse 是正好和传入的顺序是相反的。基本类型都有自带的排序规则,比如int类型默认是升序,现在结果就是降序。
原因就是
1 首先传入的是升序
2.进入takeorder时变成降序
3 创建优先队列时 再次反转 为升序列
4,最后整体来一个sort排序,这个顺序是降序。
实际调用的是takeordered算子(返回自然顺序或者自定义顺序的前num个数据)。

点进去看一下takeoredered的源码。这里主要是俩个else中的代码
第一个启用mapPartition算子,把该分区的一定顺序的num个数据塞到有界分区队列中去,这里计算好了每个分区的topN.
第二个启用的是reduce算子,把多个分区的队列加起来,因为一开始设定好了num数,有界分区队列这个队列的特性是在加入新元素重新排序之后,会把末尾元素删除。所以现在队列中保持的是全局选出的num个数据。因为reduce算子是action算子,结果会给到driver端,然后转成array进行一个排序。

take算子。
这个算子只是从rdd中拿num个数据,注意这个是没有顺序的 。这个算子可以会启动多个task。因为一个task对应一个分区,当0号分区内拿完了自然回去下一个分区拿数据,直到拿满num个。
这个算子可能会触发多次action,因为如果触发第一次action,第一个分区没有拿满数据,它会到下一个分区继续触发action,继续去拿数据


浙公网安备 33010602011771号