運算元

SmalllPig發表於2018-11-12

1.MapPartition:

遍歷的單位是每一個partition
遍歷原理:將每一個partition的資料先載入到記憶體,然後一條一條的遍歷

MapPartition:遍歷的單位是每一個partition
Map:遍歷單位是每一條記錄

MapPartition定義:
在這裡插入圖片描述
問題:
應用場景:將RDD的資料寫入mysql orcale 應該選哪一個運算元遍歷RDD?
map? mapPartition

1.Map:當用map進行操作時:
在這裡插入圖片描述

出現的問題:建立資料庫的連線太多

解決方案:
①.通過資料庫連線池 (不可行 需要池非常大)
②.批量處理(①、批太大(sql語句拼接太長) ②、Executor中使用的是Driver端中的連線,socket型別的連線是不可以序列化的(可序列化的才能走網路傳輸))
③.使用mappartition運算元

2.MapPartition:
在這裡插入圖片描述當前只有一個分割槽,只有一個建立連線
在這裡插入圖片描述
如果有10個分割槽時,會有10個連線


2.MapPartitionWithIndex:

在遍歷每一個Partition的時候能夠拿到每一個分割槽的ID號,這個運算元一般用於測試環境(看RDD有幾個分割槽,每個分割槽對映的什麼資料,可以使用這個運算元)
執行程式碼及結果:
在這裡插入圖片描述

3.CombineByKey:

遍歷原理:根據key進行遍歷聚

程式碼及執行結果、執行過程解析:
在這裡插入圖片描述
執行過程文字解析:
1.上述程式碼設定了兩個分割槽,兩個分割槽進行解析:先把同一個分割槽內的資料進行分組,相同的key資料放在一組。

2.分組完成後,開始第一步(初始化函式),得到相應的形式的資料,而且初始化函式是作用在第一個資料上(例如A的 1 上)

3.初始化完成以後,進行第二步:聚合操作,聚合操作中,如果A中有三個資料如: 1~ , 2 , 3 會進行兩次聚合形成: 1~ $2$3

4.每個分割槽資料進行聚合完畢後,會進行大聚合 得到想要的資料

問題:
1.使用combinebykey來模擬groupByKey的功能,如何實現?

rdd.combineByKey(
x=>ListBuffer[x] 初始化函式
(s:listBuffer ,i:Int)=>s+=i combine聚合函式
(s1:listBuffer,s2:listBuffer)=>s1++=s2 reduce大聚合函式
)

2.使用combinebykey來模擬reduceByKey的功能,如何實現?

x=>x
(x1:Int,x2:int)=>x1+x2
(x1:Int,x2:int)=>x1+x2

相關文章