combineByKey
combineByKey 接收三个参数,分别为createCombiner、mergeValue、mergeCombiners
createCombiner:用于产生累加器键的初值。如lambda x:(x,1),实现输入RDD[(K,V)]中V到结果RDD[(K,C)]中C的转换,V 和C可以相同,也可能不同
mergeValue: 每移动一条记录设置当前的累加的值(将V合并到C中)
mergeCombiners:在每一键组内累加相应值
我来给大家看下列子:
我转换了一个文件,在这里没有写出来,但看到我使用map拆分后看到了out[25]里面的数,这就是我们的文件数据,然后再来看到In [26]里面的代码,combineByKey里面的参数我都换成了函数,
运行步骤和规则:
第一步:
fun1()
这是根据值(V)来进行算的,也和分区有关
这里会得到一个序列[('f',(78,1)),('m',(90,1))],这个序列是虚拟的,其实真正的结果是[(75.1),(90,1)],只不过计算机会 计算相同的键对应的每个值
第二步:
fun2()
如果当K已经遇到过,使用mergeValue()会将当前的(K,V)进行合并,并进一步生成累加列表
x[0] 表示RDD列表中的值,一个个取出,和y相加,y在这里相当于sum,列y=y+x[0]
x[1]+1是代表加了几次,我们的结果中也显示出来了,这个和分区有关,但我们这里不考虑分区,
这里就会得出[('f',(515,6)),('m',(400,5))] (假设就一个分区)
第三步;
fun3()
把每个分区的结果进一步求和,最终得到我们的结果,也叫将相同的累加值进行合并。
因为会有多个分区,每个分区都有对应同一个键的累加值,所以要把各个分区的结果进行合并。