溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spark RDD算子中Key-Value型Transformation算子的示例分析

發(fā)布時間:2021-12-10 11:53:10 來源:億速云 閱讀:160 作者:小新 欄目:云計算

這篇文章主要為大家展示了“spark RDD算子中Key-Value型Transformation算子的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“spark RDD算子中Key-Value型Transformation算子的示例分析”這篇文章吧。

Key-Value型Transformation算子

Transformation處理的數(shù)據(jù)為Key-Value形式的算子,大致可以分為3種類型:輸入分區(qū)與輸出分區(qū)一對一、聚集、連接操作。

1.輸入分區(qū)與輸出分區(qū)一對一

mapValues(f)

針對(Key, Value)型數(shù)據(jù)中的 Value進行Map操作,而不對Key進行處理。

圖3-19中的方框代表RDD分區(qū)。a=>a+2代表只對(V1,1)數(shù)據(jù)中的1進行加2操作,返回結(jié)果為3。

spark RDD算子中Key-Value型Transformation算子的示例分析

2.對單個RDD或兩個RDD聚集

(1)單個RDD聚集

1)combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)

說明:

createCombiner: V => C,在C不存在的情況下,如通過V創(chuàng)建seq C。

mergeValue: (C, V) => C,當C已經(jīng)存在的情況下,需要merge,如把item V加到seq C中,或者疊加。

mergeCombiners: (C, C) => C,合并兩個C。

partitioner: Partitioner(分區(qū)器), Shuffle時需要通過Partitioner的分區(qū)策略進行分區(qū)。

mapSideCombine: Boolean = true,為了減小傳輸量,很多combine可以在map端先做。例如,疊加可以先在一個partition中把所有相同的Key的Value疊加,再shuffle。

serializerClass: String = null,傳輸需要序列化,用戶可以自定義序列化類。

例如,相當于將元素為(Int,Int)的RDD轉(zhuǎn)變?yōu)榱耍↖nt, Seq[Int])類型元素的RDD。

圖3-20中的方框代表RDD分區(qū)。通過combineByKey,將(V1, 2)、(V1, 1)數(shù)據(jù)合并為(V1, Seq(2, 1))。

spark RDD算子中Key-Value型Transformation算子的示例分析

2)reduceByKey(func, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)

reduceByKey是更簡單的一種情況,只是兩個值合并成一個值,所以createCombiner很簡單,就是直接返回v,而mergeValue和mergeCombiners的邏輯相同,沒有區(qū)別。
圖3-21中的方框代表RDD分區(qū)。通過用戶自定義函數(shù)(A, B)=>(A + B),將相同Key的數(shù)據(jù)(V1, 2)、(V1, 1)的value相加,結(jié)果為(V1, 3)。

spark RDD算子中Key-Value型Transformation算子的示例分析

3)partitionBy(numPartitions, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)

partitionBy函數(shù)對RDD進行分區(qū)操作。

如果原有RDD的分區(qū)器和現(xiàn)有分區(qū)器(partitioner)一致,則不重分區(qū),如果不一致,則相當于根據(jù)分區(qū)器生成一個新的ShuffledRDD。

圖3-22中的方框代表RDD分區(qū)。通過新的分區(qū)策略將原來在不同分區(qū)的V1、V2數(shù)據(jù)都合并到了一個分區(qū)。

spark RDD算子中Key-Value型Transformation算子的示例分析

(2)對兩個RDD進行聚集

cogroup(other, numPartitions=None)

cogroup函數(shù)將兩個RDD進行協(xié)同劃分,對在兩個RDD中的Key-Value類型的元素,每個RDD相同Key的元素分別聚合為一個集合,并且返回兩個RDD中對應(yīng)Key的元素集合的迭代器。其中,Key和Value,Value是兩個RDD下相同Key的兩個數(shù)據(jù)集合的迭代器所構(gòu)成的元組。

圖3-23中的大方框代表RDD,大方框內(nèi)的小方框代表RDD中的分區(qū)。將RDD1中的數(shù)據(jù)(U1, 1)、(U1, 2)和RDD2中的數(shù)據(jù)(U1, 2)合并為(U1, ((1, 2), (2)))。

spark RDD算子中Key-Value型Transformation算子的示例分析

3.連接

(1)join

join對兩個需要連接的RDD進行cogroup函數(shù)操作,cogroup原理請見上文。cogroup操作之后形成的新RDD,對每個key下的元素進行笛卡爾積操作,返回的結(jié)果再展平,對應(yīng)Key下的所有元組形成一個集合,最后返回RDD[(K, (V, W))]

圖3-24是對兩個RDD的join操作示意圖。大方框代表RDD,小方框代表RDD中的分區(qū)。函數(shù)對擁有相同Key的元素(例如V1)為Key,以做連接后的數(shù)據(jù)結(jié)果為(V1,(1,1))和(V1,(1,2))。

spark RDD算子中Key-Value型Transformation算子的示例分析

(2)leftOutJoin和rightOutJoin

LeftOutJoin(左外連接)和RightOutJoin(右外連接)相當于在join的基礎(chǔ)上先判斷一側(cè)的RDD元素是否為空,如果為空,則填充為空。如果不為空,則將數(shù)據(jù)進行連接運算,并返回結(jié)果。

以上是“spark RDD算子中Key-Value型Transformation算子的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI