combineByKey
- combineByKey定义如下图所示
![combineByKey定义](https://i-blog.csdnimg.cn/blog_migrate/fc21854f8f8d536a0d381ba09516b69f.png)
- 举个例子:一组(key,value),统计各个key的平均值;定义中的V默认为(key,value)中的value;实现如下(类型不声明会报错,比较奇怪)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/68e0c998a4c8709165bb981d6ca6923c.png)
aggregateByKey
- aggregateByKey定义如下图所示:比较特殊
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/48a94cc11de80d07a98e7c46ed997b05.png)
- aggregateByKey相比于combineByKey,特殊之处是你可以设置默认的初始combiner,不用createCombiner;写法的话,对于上例,把上面的写法开头 x => (x,1) 改成 (0,0) 即可(注意其他部分写法要符合定义的形式);
foldByKey
- foldByKey定义如下图所示,更为特殊
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5ded0aad74a3fcba5e63bf28b0d2f0e4.png)
- foldByKey操作作用于RDD[K,V]根据某个K将其所有V做折叠、合并处理;zeroValue用来初始化 V,然后用于 func (V,V) => V;
- 一个很好的例子来自 此处(侵删):
scala> val rdd1 = sc.makeRDD(Array(
| ("A", 1), ("A", 2), ("B", 1), ("B", 2), ("C", 1)
| ))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[12] at makeRDD at <console>:24
scala> /**
| * rdd1中每个key对应的V进行累加,注意zeroValue=0,需要先初始化V,映射函数为+操作
| * 比如,("A", 1), ("A", 2),先将zeroValue应用于每个V,得到("A", 1+0), ("A", 2+),
| * 即,("A", 1), ("A", 2),在将映射函数应用于初始化后的V,最后得到("A", 1+@), ("A", 3)
| */
| rdd1.foldByKey(0)(_+_).collect()
res14: Array[(String, Int)] = Array((B,3), (A,3), (C,1))
rdd1.foldByKey(1)(_*_).collect
res16: Array[(String, Int)] = Array((B,2), (A,2), (C,1))
- foldByKey应用场景有限