MapReduce 二次排序總結

需求

1、輸入數據:
keyA	1
keyB	3
keyB	77
keyB	54
keyA	2
keyC	22
keyC	221
keyC	20

2、目標輸出
keyA	1,2
keyB	3,54,77
keyC	20,22,221

解決思路

在這裏插入圖片描述

STEP 1. 改裝Map結構,組合成一個新的Key值

MR框架不管是 默認排序 或者是 自定義排序 都只是對Key值進行排序,但我們可以將原始數據的Key值和其對應的Value值 組合成一個新的Key值。即原始數據的Map改裝如下:

keyA,1	1
keyB,3	3
keyB,77	77
..
STEP 2. 自定義分區 setPartitionerClass,將Key第一個字段相同 放到一個Reduce中

對新的Key 進行排序,需要自定義 分區處理器(如果 新Key的 第一個字段相同,放到同一個Reduce中進行分組合並)
Map Shuffer 分區操作後,輸出的數據流如下:

# partition1:
keyA,1	1
keyA,2	2
# partition2:
keyB,3	3
keyB,77	77
keyB,54	54
# partition3
keyC,22	22
keyC,221	221
keyC,20	20
STEP 3. Key比較函數類 setSortComparatorClass

先對Key的第一個字段進行排序,如果第一個字段相同,使用Key的第二個字段進行排序。

# partition1:
keyA,1	1
keyA,2	2
# partition2:
keyB,3	3
keyB,54	54
keyB,77	77
# partition3
keyC,20	20
keyC,22	22
keyC,221	221

PS. 實現WritableComparable接口,並編寫 compareTo 方法

STEP 4. 分組排序使用的比較器 setGroupingComparatorClass

決定着 不同Key 進入不同的Reduce(對Key的第一個字段進行排序即可)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章