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的第一个字段进行排序即可)

发布了53 篇原创文章 · 获赞 50 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xw514124202/article/details/104331870
今日推荐