2個(gè)案例帶你了解萬能的CombineByKey!
combineByKey是Spark中一個(gè)比較核心的高級(jí)且底層函數(shù),其他一些高階鍵值對(duì)函數(shù)底層都是用它實(shí)現(xiàn)的。諸如 groupByKey,reduceByKey等等
如下解釋下3個(gè)重要的函數(shù)參數(shù):
·??createCombiner: V => C ,這個(gè)函數(shù)把當(dāng)前的值作為參數(shù),此時(shí)我們可以對(duì)其做些附加操作(類型轉(zhuǎn)換)并把它返回 (這一步類似于初始化操作)
·?mergeValue: (C, V) => C,該函數(shù)把元素V合并到之前的元素C(createCombiner)上 (這個(gè)操作在每個(gè)分區(qū)內(nèi)進(jìn)行)
·?mergeCombiners: (C, C) => C,該函數(shù)把2個(gè)元素C合并 (這個(gè)操作在不同分區(qū)間進(jìn)行)。
案例1:實(shí)現(xiàn)將相同Key的Value進(jìn)行合并,使用groupBy很容易實(shí)現(xiàn)
案例2:求解平均分的案例
·?作用
對(duì)數(shù)據(jù)集按照 Key 進(jìn)行聚合
·?調(diào)用
? combineByKey(createCombiner, mergeValue, mergeCombiners, [partitioner], [mapSideCombiner], [serializer])
·?參數(shù)
createCombiner 將 Value 進(jìn)行初步轉(zhuǎn)換
mergeValue 在每個(gè)分區(qū)把上一步轉(zhuǎn)換的結(jié)果聚合
mergeCombiners 在所有分區(qū)上把每個(gè)分區(qū)的聚合結(jié)果聚合
partitioner 可選, 分區(qū)函數(shù)
mapSideCombiner 可選, 是否在 Map 端 Combine
serializer 序列化器
·?注意點(diǎn)
combineByKey 的要點(diǎn)就是三個(gè)函數(shù)的意義要理解
groupByKey, reduceByKey 的底層都是 combineByKey
案例代碼
