我们先来看一下定义:
aggregate(zeroValue:U)(seqOp:(U,T)=>U,combOp:(U,U)=>U) zeroValue:U, 初始值,比如空列表{} seqOp:(U,T)=>U, seq操作符,描述如何将T合并入U,比如如何将item合并到列表 combOp:(U,U)=>U, comb操作符,描述如何合并两个U,比如合并两个列表
再看应用实例:【aggregate】
def seq(a:Int,b:Int):Int={ println("seq:"+a+":"+b) math.min(a,b)}
def comb(a:Int,b:Int):Int={ println("comb:"+a+":"+b) a+b}
def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("test_aggregate").setMaster("local") val sc = new SparkContext(conf) val z =sc.parallelize(List(1,2,4,5,8,9),3) z.aggregate(3)(seq,comb) }
seq:3:4 //3 分区1
seq:3:1 //1 分区1
seq:1:2 //1 分区1
seq:3:8 //3 分区2
seq:3:5 //3 分区2
seq:3:9 //3 分区2
comb:3:1
comb:4:3
comb:7:3 //aggregate,两个分区,但是加了三次初值(3)
res0: Int = 10
【treeAggregate】
scala> def seq(a:Int,b:Int):Int={
| println("seq:"+a+":"+b)
| math.min(a,b)} seq: (a: Int, b: Int)Int
scala> def comb(a:Int,b:Int):Int={
| println("comb:"+a+":"+b)
| a+b} comb: (a: Int, b: Int)Int
val z =sc.parallelize(List(1,2,4,5,8,9),3)
scala> z.treeAggregate(3)(seq,comb)
seq:3:4
//3 分区1
seq:3:1 //1 分区1
seq:1:2 //1 分区1
seq:3:8 //3 分区2
seq:3:5 //3 分区2
seq:3:9 //3 分区3
comb:1:3 comb:4:3
res1: Int = 7 由上可见,形式上两种用法一致,只是aggregate 比 treeAggregate在最后结果的reduce操作时,多使用了一次初始值。