Pyspark combineByKey 的算子详解

rdd = sc.parallelize([('B',1),('B',2),('A',5),('A',4),('A',3)]).repartition(3)
print("partitions details:",rdd.glom().collect())

inOfPartion = (lambda el: [(el, el ** 2)])
mergeValInOfPartion = (lambda agg1,e:agg1+[(e,e**2)])
mergeOutOfPartition = (lambda p1,p2:p1+p2)

rslt = rdd.combineByKey(inOfPartion,mergeValInOfPartion,mergeOutOfPartition)
print("result details:",rslt.collect())

1. rdd 包括三个分区,每个分区的数据如下

partitions details: [[], [('B', 1), ('A', 5), ('A', 3)], [('B', 2), ('A', 4)]]

2. inOfPartition : 针对的式同一分区的第一个健进行值处理,比如:第二分区中[(’A‘,5)] 就会针对月这个处理

3. mergeValInOfPartion : 针对的式同一分区中相同健的处理,在2的基础上,会对相同健的值做[(e,e**2)] (这个处理方法随自己定义)

4.mergeOutOfPartition  : 针对的式不同分区相同健的处理,比如第二分区处理完之后是:[('A',[(5,25),(3,27)])],第三个分区是[('A',[(4,16)])], 这个方法会将第二分区与第三分区相同健进行处理,处理方法随自己定。

综上所述,处理后的结果如下:

partitions details: [[], [('B', 1), ('A', 5), ('A', 3)], [('B', 2), ('A', 4)]]
result details: [('B', [(1, 1), (2, 4)]), ('A', [(5, 25), (3, 9), (4, 16)])]

==================================

但是如果rdd 的数据为,特别注意红色部分,这两个数据的结果是不一样的:

rdd = sc.parallelize([('B',1),('B',2),('A',3),('A',4),('A',5)]).repartition(3)
print("partitions details:",rdd.glom().collect())

inOfPartion = (lambda el: [(el, el ** 2)])
mergeValInOfPartion = (lambda agg1,e:agg1+[(e,e**3)])
mergeOutOfPartition = (lambda p1,p2:p1+p2)

rslt = rdd.combineByKey(inOfPartion,mergeValInOfPartion,mergeOutOfPartition)
print("result details:",rslt.collect())
partitions details: [[], [('B', 1), ('A', 3), ('A', 5)], [('B', 2), ('A', 4)]]
result details: [('B', [(1, 1), (2, 4)]), ('A', [(3, 9), (5, 125), (4, 16)])]
rdd = sc.parallelize([('B',1),('B',2),('A',5),('A',4),('A',3)]).repartition(3)
print("partitions details:",rdd.glom().collect())

inOfPartion = (lambda el: [(el, el ** 2)])
mergeValInOfPartion = (lambda agg1,e:agg1+[(e,e**3)])
mergeOutOfPartition = (lambda p1,p2:p1+p2)

rslt = rdd.combineByKey(inOfPartion,mergeValInOfPartion,mergeOutOfPartition)
print("result details:",rslt.collect())
partitions details: [[], [('B', 1), ('A', 5), ('A', 3)], [('B', 2), ('A', 4)]]
result details: [('B', [(1, 1), (2, 4)]), ('A', [(5, 25), (3, 27), (4, 16)])]

 

 

综上所述:使用combineByKey的时候,请注意将第一个函数(inOfPartion )和第二个函数(mergeValInOfPartion )的对元素处理的方法设置成一样的,否则,因为数据的顺序可能导致不同的结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值