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处理逻辑:
1 map: 读取数据切分字段,使用orderId作为key,封装数据到一个bean中作为map端的value传输,在对象bean中实现WritableComparable接口,覆盖compareTo方法,重写比较规则,比较金额倒序,如果金额相同则比较商品名字
2 reduce: reduce task提供的values迭代器,每次迭代返回给我们的都是同一个对象,在迭代器(循坏遍历中)每次遍历构造一个新的对象,来存储本次迭代出来的值,将很多个对象存入到list中
3 通过context传进来的参数控制topn
处理逻辑代码
Mapper类
package cn.aparke.mr.order.topn; |
Reducer类
在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提共了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。
怎么让一个对象是 可比较的,那就需要该对象实现 Comparable接口啦。然后重写里面的compareTo()方法。我们可以看到Java中很多类都是实现类这个接口的 如:Integer,Long 等等
package cn.aparke.mr.order.topn; |
JobDrivcer驱动提交类
package cn.aparke.mr.order.topn; |
OrderBean对象类
package cn.aparke.mr.order.topn; |