自定义GroupingComparator求取topN

本文介绍如何使用自定义GroupingComparator在MapReduce中处理订单数据,目标是找出每个订单中成交金额最高的交易。文章详细解释了分区、排序和分组的策略,通过将订单号和金额封装到JavaBean中,重写分区和排序规则,最终实现需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]