自定义GroupingComparator求取topN

1.GroupingComparator介绍

GroupingComparator是mapreduce当中reduce端的一个功能组件,主要的作用是决定哪些数据作为一组,调用一次reduce的逻辑,默认是每个不同的key,作为多个不同的组,每个组调用一次reduce逻辑,我们可以自定义GroupingComparator实现不同的key作为同一个组,调用一次reduce逻辑。

2.项目需求

有如下订单数据
订单id 商品id 成交金额
Order_0000001 Pdt_01 222.8
Order_0000001 Pdt_05 25.8
Order_0000002 Pdt_03 522.8
Order_0000002 Pdt_04 122.4
Order_0000002 Pdt_05 722.4
Order_0000003 Pdt_01 222.8

现在需要求出每一个订单中成交金额最大的一笔交易。

3.思路分析

3.1分区

相同的订单号发送到同一个reduce里面去,所以这个时候就得将订单号作为k2。

3.2排序

在reduce里面还要对金额进行排序,排序是对k2进行排序。要对谁进行排序就把谁当作k2,所以这个时候就把金额作为k2。

这个时候,就会发现有冲突,一个是把订单号作为k2,目的是分区。一个是把金额作为k2,目的是排序。
要想同时将我们的订单号和金额作为k2,就得把这两个字段封装到javaBean里面去,重写分区规则,按照订单号进行分区,重写排序规则,按照金额进行排序。

3.3分组

合并相同的key,并且将对应的value形成一个集合,去调用一次reduce。
而此时的k2是如下形式,没有一个k2是相等的,不能合并,所以就得重写分组的策略。
Order_0000001 222.8
Order_0000001 25.8

Order_0000002 722.4
Order_0000002 522.8
Order_0000002 122.4

Order_0000003 222.8

重写分组策略,以我们的订单号作为判断依据,订单号相同的,就认为是同一组,key进行合并,value的数据放到同一个集合里面去。形成如下格式。
Order_0000001 [222.8 25.8]
Order_0000002 [722.4 522.8 122.4]
Order_0000003 [222.8]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值