Welcome to aparke’s blog
Mapreduce经典案例之高效实现分组TopN(本案例用了排序控制、分区控制、分组控制)
题目描述
统计每一个订单中成交金额最大的三笔
数据样例:
order001,u001,小米6,1999.9,2
order001,u001,雀巢咖啡,99.0,2
order001,u001,安慕希,250.0,2
order001,u001,经典红双喜,200.0,4
order001,u001,防水电脑包,400.0,2
order002,u002,小米手环,199.0,3
order002,u002,榴莲,15.0,10
order002,u002,苹果,4.5,20
order002,u002,肥皂,10.0,40处理逻辑:
实现思路三个关键点
- 用bean做key,相同的的orderId排在一起,id小的排在前面,大的排在后面
- 重写数据分发规则Partitioner 让orderId相同的被分给同一个reduce task
- 重写Grouping Comparator只要orderId相同就 会被看成同一组进行一次reduce聚合
高效实现TopN的原理:
改变的使默认的分区规则和排序规则,因为这些MapReduce总会实现的 ,没有增加额外的缓存实现逻辑,并没有多做任何逻辑
处理逻辑代码
TopN类
package cn.aparke.mr.order.topn.grouping; |
OrderBean对象类
package cn.aparke.mr.order.topn.grouping; |
OrderIdGroupingComparator分组比较器类
package cn.aparke.mr.order.topn.grouping; |
OrderIdPartitioner类
package cn.aparke.mr.order.topn.grouping; |