pyspark-combineByKey详解

来源:互联网 发布:淘宝怎么看卖家信用 编辑:程序博客网 时间:2024/06/06 18:41

最近学习Spark我主要使用pyspark api进行编程,

网络上中文的解释不是很多,api官方文档也不是很容易明白,我结合自己的理解记录下来,方便别人参考,也方便自己回顾吧

本文介绍的是pyspark.RDD.combineByKey

combineByKey(createCombinermergeValuemergeCombinersnumPartitions=NonepartitionFunc=<function portable_hash at 0x7f1ac7340578>)

它是一个泛型函数,主要完成聚合操作,将输入RDD[(K,V)]转化为结果RDD[(K,C)]输出

例如:

x = sc.parallelize([('B',1),('B',2),('A',3),('A',4),('A',5)])createCombiner = (lambda el: [(el, el**2)])mergeVal = (lambda aggregated, el : aggregated + [(el, el**2)])mergeComb = (lambda agg1, agg2 : agg1 + agg2)y = x.combineByKey(createCombiner, mergeVal, mergeComb)print(x.collect())print(y.collect())
打印结果如下:

[('A', [(3, 9), (4, 16), (5, 25)]), ('B', [(1, 1), (2, 4)])]
主要有三个参数需要自己实现,分别是

createCombiner:实现输入RDD[(K,V)]中V到结果RDD[(K,C)]中C的转换, V和C可能是相同类型,也可能是不同类型,如上例中的createCombiner

它会创建一个元素列表

mergeValue:将V合并到C中

它会将当前值添加到元素列表的末尾

mergeCombiners:对mergeValue产生的C进一步合并,即是reduce操作

它会将两个C合并到一起

combineByKey的处理流程如下:

遍历RDD[(K,V)]中每一个元素

1、如果当前K是一个新元素,使用createCombiner()创建K为键的累加器初始值,生成列表[('A',(3,9))], [('B',(1,1))]

2、如果当前K已经遇到过,使用mergeValue()将当前(K,V)合并进第1步生成的累加器列表,,

      生成[('A',(3,9)),('A',(4,16)),('A',(5,25)) , ('B',(1,1,)), ('B', (2,4))]

      否则执行第1步

3、将相同键值的累加器进行合并,得到[('A', [(3, 9), (4, 16), (5, 25)]), ('B', [(1, 1), (2, 4)])]

因此得到如下结果:

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


分析完毕!

以上内容不一定完全正确,只是能够帮助对该api的理解和使用吧


参考资料

1、https://spark.apache.org/docs/1.6.1/api/python/pyspark.html?highlight=combinebykey#pyspark.RDD.combineByKey

2、http://blog.csdn.net/dream_angel_z/article/details/51620438




0 0