您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“spark RDD算子中Key-Value型Transformation算子的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“spark RDD算子中Key-Value型Transformation算子的示例分析”這篇文章吧。
Key-Value型Transformation算子
Transformation處理的數據為Key-Value形式的算子,大致可以分為3種類型:輸入分區與輸出分區一對一、聚集、連接操作。
1.輸入分區與輸出分區一對一
mapValues(f)
針對(Key, Value)型數據中的 Value進行Map操作,而不對Key進行處理。
圖3-19中的方框代表RDD分區。a=>a+2代表只對(V1,1)數據中的1進行加2操作,返回結果為3。
2.對單個RDD或兩個RDD聚集
(1)單個RDD聚集
1)combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)
說明:
createCombiner: V => C,在C不存在的情況下,如通過V創建seq C。
mergeValue: (C, V) => C,當C已經存在的情況下,需要merge,如把item V加到seq C中,或者疊加。
mergeCombiners: (C, C) => C,合并兩個C。
partitioner: Partitioner(分區器), Shuffle時需要通過Partitioner的分區策略進行分區。
mapSideCombine: Boolean = true,為了減小傳輸量,很多combine可以在map端先做。例如,疊加可以先在一個partition中把所有相同的Key的Value疊加,再shuffle。
serializerClass: String = null,傳輸需要序列化,用戶可以自定義序列化類。
例如,相當于將元素為(Int,Int)的RDD轉變為了(Int, Seq[Int])類型元素的RDD。
圖3-20中的方框代表RDD分區。通過combineByKey,將(V1, 2)、(V1, 1)數據合并為(V1, Seq(2, 1))。
2)reduceByKey(func, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)
reduceByKey是更簡單的一種情況,只是兩個值合并成一個值,所以createCombiner很簡單,就是直接返回v,而mergeValue和mergeCombiners的邏輯相同,沒有區別。
圖3-21中的方框代表RDD分區。通過用戶自定義函數(A, B)=>(A + B),將相同Key的數據(V1, 2)、(V1, 1)的value相加,結果為(V1, 3)。
3)partitionBy(numPartitions, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)
partitionBy函數對RDD進行分區操作。
如果原有RDD的分區器和現有分區器(partitioner)一致,則不重分區,如果不一致,則相當于根據分區器生成一個新的ShuffledRDD。
圖3-22中的方框代表RDD分區。通過新的分區策略將原來在不同分區的V1、V2數據都合并到了一個分區。
(2)對兩個RDD進行聚集
cogroup(other, numPartitions=None)
cogroup函數將兩個RDD進行協同劃分,對在兩個RDD中的Key-Value類型的元素,每個RDD相同Key的元素分別聚合為一個集合,并且返回兩個RDD中對應Key的元素集合的迭代器。其中,Key和Value,Value是兩個RDD下相同Key的兩個數據集合的迭代器所構成的元組。
圖3-23中的大方框代表RDD,大方框內的小方框代表RDD中的分區。將RDD1中的數據(U1, 1)、(U1, 2)和RDD2中的數據(U1, 2)合并為(U1, ((1, 2), (2)))。
3.連接
(1)join
join對兩個需要連接的RDD進行cogroup函數操作,cogroup原理請見上文。cogroup操作之后形成的新RDD,對每個key下的元素進行笛卡爾積操作,返回的結果再展平,對應Key下的所有元組形成一個集合,最后返回RDD[(K, (V, W))]
圖3-24是對兩個RDD的join操作示意圖。大方框代表RDD,小方框代表RDD中的分區。函數對擁有相同Key的元素(例如V1)為Key,以做連接后的數據結果為(V1,(1,1))和(V1,(1,2))。
(2)leftOutJoin和rightOutJoin
LeftOutJoin(左外連接)和RightOutJoin(右外連接)相當于在join的基礎上先判斷一側的RDD元素是否為空,如果為空,則填充為空。如果不為空,則將數據進行連接運算,并返回結果。
以上是“spark RDD算子中Key-Value型Transformation算子的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。