当使用combineByKey算子进行操作时,代码的要求是按照相同的key求相同key的平均值,所以我们希望获得对应的元组
("a",(3,2)) ("b",(5,2)) 其中key为原数据中的键,value为一个元组,该元组的第一个值代表数据之和,第二个代表次数
我们使用combineByKey就可以完成上述操作,首先将第一个value值映射为(value,1)
然后迭代每个对象,t._1+v代表不断用新的元组的key+原数据中的value,t._2+1代表每加一次次数+1
第三个匿名函数是用来进行不同分区之间的操作,将不同分区相同key对应value进行相加
上述代码报错的原因是t1和t2分别代表元组,此时编译器不能自动推断出类型,所以需要手动添加类型:
val value = rdd.combineByKey( v => (v, 1), (t: (Int, Int), v) => { (t._1 + v, t._2 + 1) }, (t1: (Int, Int), t2: (Int, Int)) => { (t1._1 + t2._1, t1._2 + t2._2) } )