首先 先来看看官方文档
combineByKey[C](createCombiner: (V) ⇒ C, mergeValue: (C, V) ⇒ C, mergeCombiners: (C, C) ⇒ C, numPartitions: Int): RDD[(K, C)]
简单的解释下3个重要的函数参数:
- createCombiner: V => C ,这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)
- mergeValue: (C, V) => C,该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)
- mergeCombiners: (C, C) => C,该函数把2个元素C合并 (这个操作在不同分区间进行)
实现一次案例:
1.首先在1这个key第一次被发现,调用第一个lambda,生成(1,(10,1))
2.同理2这个key会生成(2,(20,1))
3.由于第三个元素(1,30)的键1已经被发现了,所以调用第二个lamba生成(1,(10+30,1+1))=(1,40,2))
4.同理生成(2,(60,2))
5.最后,假设有多个partition同时运行,则调用第三个lambda把键相同的数据合并起来
最后一个map的操作就是求出key所对应的平均值