spark中算子详解:aggregateByKey

https://blog.csdn.net/jiaotongqu6470/article/details/78457966

 

通过scala集合以并行化方式创建一个RDD

scala> val pairRdd = sc.parallelize(List(("cat",2),("cat",5),("mouse",4),("cat",12),("dog",12),("mouse",2)),2)

 

pairRdd 这个RDD有两个区,一个区中存放的是:

("cat",2),("cat",5),("mouse",4)

 

另一个分区中存放的是:

("cat",12),("dog",12),("mouse",2)

  

然后,执行下面的语句

scala > pairRdd.aggregateByKey(100)(math.max(_ , _),  _ + _ ).collect


结果:

res0: Array[(String,Int)] = Array((dog,100),(cat,200),(mouse,200)

下面是以上语句执行的原理详解:

aggregateByKey的意思是:按照key进行聚合

第一步:将每个分区内key相同数据放到一起

分区一

("cat",(2,5)),("mouse",4)

分区二

("cat",12),("dog",12),("mouse",2)

  

第二步:局部求最大值

对每个分区应用传入的第一个函数,math.max(_ , _),这个函数的功能是求每个分区中每个key的最大值

这个时候要特别注意,aggregateByKe(100)(math.max(_ , _),_+_)里面的那个100,其实是个初始值


在分区一中求最大值的时候,100会被加到每个key的值中,这个时候每个分区就会变成下面的样子


分区一

("cat",(2,5,100)),("mouse",(4,100))

然后求最大值后变成:

("cat",100), ("mouse",100)

分区二

("cat",(12,100)),("dog",(12.100)),("mouse",(2,100))

求最大值后变成:

("cat",100),("dog",100),("mouse",100)

 

第三步:整体聚合

将上一步的结果进一步的合成,这个时候100不会再参与进来

 

最后结果就是:

(dog,100),(cat,200),(mouse,200)
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值