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 )的对元素处理的方法设置成一样的,否则,因为数据的顺序可能导致不同的结果