Spark由淺到深(3)-- 鍵值對型數據操作

鍵值對 RDD 是 Spark 中許多操作所需要的常見數據類型。因此剛入門時候用來練手和熟悉Spark, 鞏固之前所學是很有必要的.

Spark 爲包含鍵值對類型的 RDD 提供了一些專有的操作。這些 RDD 被稱爲 pair RDD。

Pair RDD 是很多程序的構成要素, 因爲它們提供了並行操作各個鍵或跨節點重新進行數據分組的操作接口。


1. 創建Pair RDD

在 Spark 中有很多種創建 pair RDD 的方式。

構建鍵值對 RDD 的方法在不同的語言中會有所不同。

在 Python 中,爲了讓提取鍵之後的數據能夠在函數中使用,需要返回一個由二元組組成的 RDD.

// 使用第一個單詞作爲鍵創建出一個 pair RDD
pairs = lines.map(lambda x: (x.split(" ")[0], x))

2. Pair RDD的轉化操作

Pair RDD 可以使用所有標準 RDD 上的可用的轉化操作

由於 pair RDD 中包含二元組,所以需要傳遞的函數應當操作二元組而不是獨立的元素.

Pair RDD的轉化操作函數有:

reduceByKey(func)       合併具有相同鍵的值
groupByKey()            對具有相同鍵的值進行分組
combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner)              使用不同的返回類型合併具有相同鍵的值 
mapValues(func)pair RDD 中的每個值應用一個函數而不改變鍵 
flatMapValues(func)pair RDD 中的每個值應用一個返回迭代器的函數, 然後對返回的每個元素都生成一個對應原鍵的鍵值對記錄。 通常用於符號化
keys()                  返回一個僅包含鍵的 RDD
values()                返回一個僅包含值的 RDD
sortByKey()             返回一個根據鍵排序的 RDD 

針對 兩個 pair RDD的轉化操作:

subtractByKey           刪掉 RDD 中鍵與 other RDD 中的鍵相同的元素 
join                    對兩個 RDD 進行內連接
rightOuterJoin          對兩個 RDD 進行連接操作,確保第一個RDD的鍵必須存在(右外連接)
leftOuterJoin           對兩個 RDD 進行連接操作,確保第二個RDD的鍵必須存在(左外連接) 
cogroup                 將兩個 RDD 中擁有相同鍵的數據分組到一起 

Pair RDD 也還是 RDD(元素爲 Python 中的元組),因此同樣支持 RDD 所支持的函數。

// 前一節中的 pair RDD,篩選掉長度超過20 個字符的行
// Python 對第二個元素進行篩選

result = pairs.filter(lambda keyValue: len(keyValue[1]) < 20)

有時,我們只想訪問 pair RDD 的值部分,這時操作二元組很麻煩。

由於這是一種常見的使用模式,因此 Spark 提供了 mapValues(func) 函數,功能類似於 map{case (x, y): (x,func(y))}。可以在很多例子中使用這個函數。

接下來就依次討論 pair RDD 的各種操作,先從聚合操作開始。


2.2 聚合操作

當數據集以鍵值對形式組織的時候,聚合具有相同鍵的元素進行一些統計是很常見的操作。

基礎型 RDD 上的 fold()、 combine()、 reduce() 等行動操作;
pair型 RDD 上則有相應的針對鍵的轉化操作。

Spark 有一組類似的操作,可以組合具有相同鍵的值。
這些操作返回 RDD,因此它們是轉化操作而不是行動操作。

reduceByKey() 與 reduce() 相當類似
foldByKey() 則與 fold() 相當類似

使用 reduceByKey() 和 mapValues() 來計算每個鍵的對應值的均值。這和使用 fold() 和 map() 計算整個 RDD 平均值的過程很相似.

// Python 中使用 reduceByKey() 和 mapValues() 計算每個鍵對應的平均值
rdd.mapValues(lambda x: (x, 1)).reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))

combineByKey() 是最爲常用的基於鍵進行聚合的函數。大多數基於鍵聚合的函數都是用它實現的。和 aggregate() 一樣, combineByKey() 可以讓用戶返回與輸入數據的類型不同的返回值。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章