Spark操作—aggregate
1、aggregate
首先看下 aggregate 函数签名
1 | def aggregate[U : ClassTag](zeroValue : U)(seqOp : (U, T) = > U, combOp : (U, U) = > U) : U |
说明
参数zeroValue:seqOp运算符的每个分区的累积结果的初始值以及combOp运算符的不同分区的组合结果的初始值 - 这通常将是初始元素(例如“Nil”表的列表 连接或“0”表示求和) 参数seqOp: 每个分区累积结果的聚集函数。 参数combOp: 一个关联运算符用于组合不同分区的结
应用举例
数据准备
1 2 3 4 5 6 7 8 9 10 11 | //获取 SparkConf 并设置应用名称*本地模式 val conf : SparkConf = new SparkConf().setAppName( "Spark" ).setMaster( "local[*]" ) //获取 Spark 上下文对象 val sc : SparkContext = new SparkContext(conf) val rdd : RDD[Int] = sc.makeRDD(List( 1 , 2 , 3 , 4 ), 2 ) rdd.mapPartitionsWithIndex { case (index, data) = > { println(index + " -> " + data.mkString( "," )) } data }.collect().foreach(println) |
输出
1 2 | 1 -> 3 , 4 0 -> 1 , 2 |
需求1:默认值 0 ,分区内求和,分区间求和
1 | println(rdd.aggregate( 0 )( _ + _ , _ + _ )) |
分析
/** * 0 -> 0 + 1 + 2 => 3 * 1 -> 0 + 3 + 4 => 7 * 0 -> 3 * 1 -> 7 * 0 + 3 + 7 * 10 + 0 * 10 */
需求2:默认值 10 ,分区内求和,分区间求和
/** * 0 -> 10 + 1 + 2 => 13 * 1 -> 10 + 3 + 4 => 17 * 0 -> 13 * 1 -> 17 * 10 + 13 + 17 * 40 */
需求3:分区内求最大值,分区间求和
1 | println(rdd.aggregate( 2 )(math.max( _ , _ ), _ + _ )) |
分析
1 2 3 4 5 6 7 8 | /** * 0 -> max(2,1,2) => 2 * 1 -> max(2,3,4) => 4 * 0 -> 2 * 1 -> 4 * 2 + 2 + 4 * 8 */ |
接下来看下 书本上的一个案例
1 2 3 4 5 6 | val tuple : (Int, Int) = rdd.aggregate(( 0 , 0 ))( (acc, value) = > (acc. _ 1 + value, acc. _ 2 + 1 ), (acc 1 , acc 2 ) = > (acc 1 . _ 1 + acc 2 . _ 1 , acc 1 . _ 2 + acc 2 . _ 2 ) ) println(tuple) println(tuple. _ 1 / tuple. _ 2 .toDouble) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下