在第一字段有序的基础上第二字段也排序
比如要获取如下结果
1,2
1,3
1,4
2,3
2,4
3,4
方法1:Reduce内排序
class Mapper
method Map(first f,second s)
Emit(first f,second s)
class Reducer
method Reduce(first f, second [s1,s2,s3...])
sort([s1,s2,s3])
for second s in [s1,s2,s3] do
Emit(first f,second s)
思路是先收集起同一key的所有数据,在reduce端进行value的排序
缺点是reduce端必须保存所有的value值,如果单一key对应的数据少,那么无所谓;如果value值多到内存放不下,那么就难以进行排序
处理示例
1,3 => map => 1,3 => reduce => 1,2
1,4 1,4 1,3
1,2 1,2 1,4
方法2:利用执行机制排序
class Mapper
method Map(first f,second s)
Emit(Pair<first f, second s>,second s)
思路是既然执行时要对key排序,那么把value也引入key中,在维持key的分组作用的同时排序value
key变成了复合内容,引入了s,可以用于实现second排序
重写Partitioner,first相同的分到一起
重写GroupComparator ,first相同就是属于同一组
重写KeyComparator,先比较first,分不出大小再比较second
Reducer 拿到数据时已经是排序好的,直接输出即可
处理示例
1,3 => map => (1,3),3 => (1,2),2 => reduce => 1,2
1,4 (1,4),4 (1,3),3 1,3
1,2 (1,2),2 (1,4),4 1,4