最近学习Spark,我主要使用pyspark api进行编程,
网络上中文的解释不是很多,api官方文档也不是很容易明白,我结合自己的理解记录下来,方便别人参考,也方便自己回顾吧
本文介绍的是pyspark.RDD.combineByKey
combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=
它是一个泛型函数,主要完成聚合操作,将输入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