Key-Value型Transformation算子ide
Transformation處理的數據爲Key-Value形式的算子,大體能夠分爲3種類型:輸入分區與輸出分區一對1、彙集、鏈接操做。函數
1.輸入分區與輸出分區一對一spa
mapValues(f)orm
針對(Key, Value)型數據中的 Value進行Map操做,而不對Key進行處理。hash
圖3-19中的方框表明RDD分區。a=>a+2表明只對(V1,1)數據中的1進行加2操做,返回結果爲3。it
2.對單個RDD或兩個RDD彙集io
(1)單個RDD彙集table
1)combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)function
說明:form
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分區。經過新的分區策略將原來在不一樣分區的V一、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元素是否爲空,若是爲空,則填充爲空。若是不爲空,則將數據進行鏈接運算,並返回結果。