需求
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的第一個字段進行排序即可)