二次排序

在第一字段有序的基础上第二字段也排序

比如要获取如下结果

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

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值