Spark-聚合操作-combineByKey

combineByKey函數主要接受了三個函數作爲參數,分別爲createCombiner、mergeValue、mergeCombiners。這三個函數足以說明它究竟做了什麼。理解了這三個函數,就可以很好地理解combineByKey。


要理解combineByKey(),要先理解它在處理數據時是如何處理每個元素的。由於combineByKey()會遍歷分區中的所有元素,因此每個元素的鍵要麼還沒有遇到過,要麼就和之前的鍵相同。combineByKey()的處理流程如下:


如果是一個新的元素,此時使用createCombiner()來創建那個鍵對應的累加器的初始值。(!注意:這個過程會在每個分區第一次出現各個鍵時發生,而不是在整個RDD中第一次出現一個鍵時發生。)


如果這是一個在處理當前分區中之前已經遇到鍵,此時combineByKey()使用mergeValue()將該鍵的累加器對應的當前值與這個新值進行合併。


3.由於每個分區都是獨立處理的,因此對於同一個鍵可以有多個累加器。如果有兩個或者更多的分區都有對應同一個鍵的累加器,就需要使用用戶提供的mergeCombiners()將各個分區的結果進行合併。


val data = Array((1, 1.0), (1, 2.0), (1, 3.0), (2, 4.0), (2, 5.0), (2, 6.0))
val rdd = sc.parallelize(data, 2)
val combine1 = rdd.combineByKey(createCombiner = (v:Double) => (v:Double, 1),
mergeValue = (c:(Double, Int), v:Double) => (c._1 + v, c._2 + 1),
mergeCombiners = (c1:(Double, Int), c2:(Double, Int)) => (c1._1 + c2._1, c1._2 + c2._2),
numPartitions = 2 )
combine1.collect
res0: Array[(Int, (Double, Int))] = Array((2,(15.0,3)), (1,(6.0,3)))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章