1. 定义
/*
* 1. 定义
* def foldByKey(zeroValue: V)(func: (V, V) => V): RDD[(K, V)]
* def foldByKey(zeroValue: V,partitioner: Partitioner)(func: (V, V) => V): RDD[(K, V)]
* def foldByKey(zeroValue: V, numPartitions: Int)(func: (V, V) => V): RDD[(K, V)]
*
* 2. 功能
* 1. 分区内 根据相同的key,对value分组
* 示例 :
* key,iter(value1,value2,value3)
* 2. 根据传入的规则 reduce分区内的 相同key的 value
* 示例 :
* func(zeroValue,value1)
* 3. 聚合后输出每个分区的结果 key,value
*
* 4. 拉取每个分区 的key,value ,并对相同key 的value做reduce操作(存在Shuffle过程)
* 示例 : func(zeroValue,value1)...
*
* 5. 对 所有分区的key 做完reduce操作后,按照指定的 partitioner 重新对结果分区
* 不指定分区器时,用默认分区器 HashPartitoner
* 不指定分区个数时,用父Rdd分区个数
*
* 3. note
* 1. zeroValue 会参与 分区内和分区间的 reduce操作
* 2. foldByKey 等价于 aggregateByKey(分区内函数=分区间函数)
*
* */
2. 示例
object aggregateTest extends App {
val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("distinctTest")
val sc: SparkContext = new SparkContext(sparkconf)
val rdd: RDD[(Int, String)] = sc.makeRDD(List((2, "x1"), (2, "x2"), (2, "x3"), (4, "x4"), (5, "x5"), (5, "x6"), (6, "x7")), 2)
private val rdd2 = rdd.foldByKey("")(
(zeroValue, value) => zeroValue + "-" + value
)
println(s"${rdd2.collect().mkString(",")}")
sc.stop()
}