1. 定义
/*
* 1. 定义
* def reduceByKey(func: (V, V) => V): RDD[(K, V)]
* def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)]
* def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)]
*
* 2. 功能
* 按照相同的 Key 对 Value 进行聚合
* 传输的函数为聚合规则(相对于MapReduce中的reduce函数)
*
* 3. note
* 1. 发送到reduce端聚合时,会在Map端预聚合(自动触发)
* 2. 只能操作 key-value类型的Rdd
* 3. 不指定分区器时,使用默认分区器和分区个数和父Rdd相同
* 4. scala语言中一般的聚合操作都是两两聚合,spark基于scala开发的,所以它的聚合也是两两聚合
* 5. 当key 只要一个元素时,参数函数时不会参与运算的
* 6. 指定的分区器和分区个数,是对聚合结果的处理
*
* */
2. 示例
object RddTransitionOperator_reduceByKey extends App {
private val sc: SparkContext = CommonUtils.getSparkContext("zip operator")
private val rdd: RDD[(String, Int)] = sc.parallelize(List(("word", 1), ("word", 2), ("豆", 3), ("豆", 4)), 1)
// 使用默认分区器 + 分区个数等于父rdd分区个数
private val rdd3: RDD[(String, Int)] = rdd.reduceByKey((v1, v2) => v1 + v2)
println(s"分区个数:${rdd3.getNumPartitions}")
println(s"类名:${rdd3.getClass.getName}")
println(s"依赖类型:${rdd3.dependencies}")
// 分区个数:1
// 类名:org.apache.spark.rdd.ShuffledRDD
// 依赖类型:List(org.apache.spark.ShuffleDependency@acdcf71)
println(rdd3.collect.mkString(","))
//1,2,3,3,7
// 使用默认分区器 + 指定rdd分区个数
private val rdd4: RDD[(String, Int)] = rdd.reduceByKey((v1, v2) => v1 + v2, 3)
println(s"分区个数:${rdd4.getNumPartitions}")
println(s"类名:${rdd4.getClass.getName}")
println(s"依赖类型:${rdd4.dependencies}")
// 分区个数:3
// 类名:org.apache.spark.rdd.ShuffledRDD
// 依赖类型:List(org.apache.spark.ShuffleDependency@6631cb64)
// 使用指定分区器
private val rdd5: RDD[(String, Int)] = rdd.reduceByKey(new HashPartitioner(2), (v1, v2) => v1 + v2)
println(s"分区个数:${rdd5.getNumPartitions}")
println(s"类名:${rdd5.getClass.getName}")
println(s"依赖类型:${rdd5.dependencies}")
//sc.stop()
//while (true) {}
}