说明
- 对RDD中的数据进行初始化后进行分区内和分区间的合并。
函数签名
- createCombiner:对数据进行初始化,并将数据作为参数,可以对数据进行转换操作,分区内每种key调用一次。
- mergeValue:分区内合并,将key相同的元素V合并到刚刚经过转换的C上。
- mergeCombiners:分区间合并,将key相同的两个C合为一个C。
执行过程
代码示例
val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")
val sc = new SparkContext(conf)
val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 88), ("b", 95), ("a", 91),
("b", 93), ("a", 95), ("b", 98)), 2)
val combineRDD: RDD[(String, (Int, Int))] = rdd.combineByKey(
(_, 1),
(tup1: (Int, Int), value) => {
(tup1._1 + value, tup1._2 + 1)
},
(tup2: (Int, Int), tup3: (Int, Int)) => {
(tup2._1 + tup3._1, tup2._2 + tup3._2)
}
)
val resRDD: RDD[(String, Int)] = combineRDD.map {
case (key, datas) => {
(key, datas._1 / datas._2)
}
}
resRDD.collect().foreach(println)
sc.stop()