1. 定义
/*
* 1. 定义
* def combineByKey[C](createCombiner: V => C,
* mergeValue: (C, V) => C,
* mergeCombiners: (C, C) => C,
* numPartitions: Int): RDD[(K, C)]
*
* def combineByKey[C](createCombiner: V => C,
* mergeValue: (C, V) => C,
* mergeCombiners: (C, C) => C,
* partitioner: Partitioner,
* serializer: Serializer = null): RDD[(K, C)]
*
* def combineByKey[C](createCombiner: V => C,
* mergeValue: (C, V) => C,
* mergeCombiners: (C, C) => C): RDD[(K, C)]
*
* createCombiner : 将相同key的第一个value,进行数据类型转换
* mergeValue : 分区内 相同key 聚合规则
* mergeCombiners : 分区间 相同key 聚合规则
*
* 2. 功能
* 1. 对 key-value型rdd 按相同的key 对value进行聚合
* 2. 可以将 Rdd[(K,V)] 转换为 Rdd[(K,C)]
*
* 3. 操作流程
* 1. 分区内 对相同的key 进行分组
* key iter(value1,value2,value3)
*
* 2. 分区内 对相同key 的value进行聚合
* 1. 将 value1 转换为 createCombiner(value1)=数据类型C
* 2. 按照指定的规则对 value进行聚合
* mergeValue(createCombiner(value1),value2) => 数据类型C
* note : createCombiner(value1),value2类型可能不一致
* 3. 合并完结果为
* key,数据类型C
*
* 3. 分区间 对相同key 的value进行聚合
* 1.按照指定的规则对 value进行聚合
* mergeCombiners: (数据类型C, 数据类型C) => 数据类型C
*
* */
2. 示例
object combineByKeyPakTest 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.combineByKey(
//转换 value类型为List
(tp) => {
println(s"转换:${tp}")
List[String](tp)
},
(list: List[String], value1: String) => {
list :+ value1
}
, (list1: List[String], list2: List[String]) => {
list1.union(list2)
}
)
println(s"${rdd2.collect().mkString(",")}")
sc.stop()
}