spark aggregate函式

高華傑發表於2017-09-08

aggregate函式將每個分割槽裡面的元素進行聚合,然後用combine函式將每個分割槽的結果和初始值(zeroValue)進行combine操作。這個函式最終返回的型別不需要和RDD中元素型別一致。

def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U
 
注意:
1.每個分割槽開始聚合第一個元素都是zeroValue
2.分割槽之間的聚合,zeroValue也參與運算
 
scala> val rdd = sc.parallelize(List(18,28,7,66,-19,100,29,55,4),3)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:24

//先對分割槽內的元素進行聚合;
scala> def InnerCom(a:Int, b:Int) : Int = {
     | println("InnerCom: " + a + " : " + b)
     | math.min(a,b)
     | }
InnerCom: (a: Int, b: Int)Int

//對聚合後的分割槽之間進行聚合
scala> def partitionCom(a:Int, b:Int): Int = {
     | println("partitionCom: " + a + " : " + b)
     | a + b
     | }
partitionCom: (a: Int, b: Int)Int

//3個分割槽,min(分割槽1)=7,min(分割槽2)=-19,min(分割槽1)=4
//50 + 7 + -19 + 4 = 42
scala> rdd.aggregate(50)(InnerCom,partitionCom)
InnerCom: 50 : 18
InnerCom: 18 : 28
InnerCom: 18 : 7
partitionCom: 50 : 7
InnerCom: 50 : 66
InnerCom: 50 : -19
InnerCom: -19 : 100
partitionCom: 57 : -19
InnerCom: 50 : 29
InnerCom: 29 : 55
InnerCom: 29 : 4
partitionCom: 38 : 4
res5: Int = 42

 

相關文章