1. 程式人生 > >Spark—聚合操作—combineByKey

Spark—聚合操作—combineByKey

聚合操作——combineByKey

當資料集一鍵值對形式組織的時候,聚合具有相同鍵的元素進行一些統計是很常見的操作。對於Pair RDD常見的聚合操作如:reduceByKey,foldByKey,groupByKey,combineByKey。這裡重點要說的是combineByKey。

在資料分析中,處理Key,Value的Pair資料是極為常見的場景,例如我們可以針對這樣的資料進行分組、聚合或者將兩個包含Pair資料的RDD根據key進行join。從函式的抽象層面看,這些操作具有共同的特徵,都是將型別為RDD[(K,V)]的資料處理為RDD[(K,C)]。這裡的V和C可以是相同型別,也可以是不同型別。這種資料處理操作並非單純的對Pair的value進行map,而是針對不同的key值對原有的value進行聯合(Combine)。因而,不僅型別可能不同,元素個數也可能不同。

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

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

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

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

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

示例:

這裡寫圖片描述