Spark combineByKey 功能
重要的三个参数:简单说
createCombiner: V => C : 对key的value进行转换结构
mergeValue: (C, V) => C : 同一分区内,相同key的value怎么进行处理
mergeCombiners: (C, C) => C :不同分区间,相同key的value怎么进行处理
note:
分区内和分区间计算规则不相同
案例演示
sc.makeRDD(List((“zs”, 90), (“lisi”, 60), (“zs”, 91), (“lisi”, 40), (“zs”, 92), (“lisi”, 50)))
需求:求每个学生的平均成绩
package com.xcu.bigdata.spark.core.pg02_rdd.pg022_rdd_transform
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* @Desc : combineByKey参数解释如下
* -createCombiner: V => C,对当前key中的第一个value进行结构转化
* -mergeValue: (C, V) => C,分区内计算规则,将当前key的value值,合并到初始化得到的c上面
* -mergeCombiners: (C, C) => C,分区间计算规则,将两个c合并为一个
*
*/
object Spark17_CombineByKey {
def main(args: Array[String]): Unit = {
//创建配置文件
val conf: SparkConf = new SparkConf().setAppName("").setMaster("local[*]")
//创建SparkContext,该对象是提交的入口
val sc = new SparkContext(conf)
//创建RDD
val rdd: RDD[(String, Int)] = sc.makeRDD(List(("zs", 90), ("lisi", 60), ("zs", 91), ("lisi", 40), ("zs", 92), ("lisi", 50)))
//求出每一个学生的平均成绩 方式1
val combineRDD: RDD[(String, (Int, Int))] = rdd.combineByKey(
//对当前key中的第一个value进行结构转化
(x: Int) => (x, 1),
//分区内计算规则,主要在分区内进行,将当前key的value值,合并到初始化得到的c上面
(t1: (Int, Int), v: Int) => {
(t1._1, t1._2 + 1)
},
//分区间计算规则,将两个c合并为一个
(t2: (Int, Int), t3: (Int, Int)) => {
(t2._1 + t3._1, t2._2 + t3._2)
}
)
//求平均成绩
val resRDD: RDD[(String, Int)] = combineRDD.map {
case (name, (score, count)) => {
(name, score / count)
}
}
//打印输出
resRDD.collect().foreach(println)
//释放资源
sc.stop()
}
}
res:
(zs,91)
(lisi,50)