目录

  • ​​spark outline​​
  • ​​Spark combineByKey 功能​​
  • ​​案例演示​​

spark outline

​​大纲目录​​

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)))
需求:求每个学生的平均成绩

Spark combineByKey_spark

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)