- 定义:combineByKey(createCombiner,mergePart,mergerbine )
| combineByKey需要传递三个参数(函数) |
| 1、createCombiner函数 将相同key值的某一个value数据进行一个函数操作,得到一个新的value数据---零值(新的value数据是我们后期聚合的数据) |
| v=>U |
| 2、mergepart函数 将同一个分区中key值相同的value数据(上一步函数中转换得到的新的value) 聚合操作 |
| (U,V)=>U |
| 3、mergercombin函数 将不同分区中key值相同的聚合出来的结果再进行一次聚合操作 |
| (U,U)=>U |
|
解释 |
区别 |
reduce |
对所有的数据进行聚合 |
数据类型无法定义 |
aggregateByKey |
可以实现每个分区先聚合,然后再整体聚合 |
效率高,但是每一个分区聚合或者不同分区聚合的时候都必须和零值进行聚合 |
combineBykey |
可以实现每个分区先聚合,然后再整体聚合 |
效率高,且不需要传递零值,到底对什么样的数据进行聚合,自定义 |
| object CombineByKeyTransRDD { |
| def main(args: Array[String]): Unit = { |
| val sparkConf = new SparkConf().setMaster("local").setAppName("kv") |
| val sc = new SparkContext(sparkConf) |
| |
| combineByKeyOpt(sc) |
| |
| sc.stop() |
| } |
| |
| def combineByKeyOpt(sc: SparkContext): Unit = { |
| println("----------------combineByKey开始------------------") |
| val rdd: RDD[(String,Int)] = sc.makeRDD(Array(("zs",60),("zs",70),("zs",80),("ls",66),("ls",60),("ls",77))) |
| |
| val sum: RDD[(String, Int)] = rdd.combineByKey( |
| (a: Int) => { |
| a |
| }, |
| (a: Int, b: Int) => { |
| a + b |
| }, |
| (a: Int, b: Int) => { |
| a + b |
| } |
| ) |
| |
| |
| |
| |
| sum.foreach(println(_)) |
| |
| |
| val value = rdd.combineByKey( |
| |
| (a: Int) => { |
| (a, 1) |
| }, |
| |
| (tuple2: (Int, Int), score: Int) => { |
| (tuple2._1 + score, tuple2._2 + 1) |
| }, |
| (tuplea: (Int, Int), tupleb: (Int, Int)) => { |
| (tuplea._1 + tupleb._1, tuplea._2 + tupleb._2) |
| } |
| ) |
| value.foreach(println(_)) |
| val rdd4 = value.mapValues(tuple2 => { |
| tuple2._1 / tuple2._2.toDouble |
| }) |
| rdd4.foreach(println(_)) |
| |
| println("----------------combineByKey结束------------------") |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?