1、需求
获取每个订单中最贵的商品
用到的知识点:
自定义排序,包括普通排序,二次排序,分组排序
自定义分区
2、数据输入和输出格式
数据输入格式:
每个已售商品一条记录
订单id 商品id 商品价格
0000001 Pdt_01 222.8
0000002 Pdt_06 722.4
0000001 Pdt_05 25.8
0000003 Pdt_01 222.8
0000003 Pdt_01 33.8
0000002 Pdt_03 522.8
0000002 Pdt_04 122.4
数据输出格式:
每个订单一个文件,每个文件中显示各自订单最贵的一件商品的信息
3、分析
map阶段:
因为要求每个订单最贵的商品,所以必须根据订单号以及商品价格做二次排序。后面将订单号、商品id,商品价格组合成一个bean对象,作为key,作为map的输出。
自定义分区:
我们的需求是统计出同一订单中,最贵的商品,那么这就要求同一订单的所有商品条目都必须落在同一分区中(这里分区数大于1)才能统计处理,如果在不同分区中,那么是无法统计的,因为不用reduce之间是没有关联的。这里实现方式就是自定义分区,采用订单ID来分区,这样同一订单ID的商品条目就都落在同一个分区中了。而且在map输出自动根据订单id分区的过程中,对key先按照id和price排序,这样其实就是对同一订单的商品中,按照商品价格进行了排序了。
reduce阶段:
前面map输出的数据已经是每个订单中对商品价格进行了排序,在第一个的商品就是该订单中价格最高的商品,后面这里其实只需要取出第一个KV即可。利用自定义group分组排序,将同一订单ID但是不同的商品的KV聚合成一组,因为事实上每组KV的key是不同,而分组中的key是以第一个进入该分组的KV的key为准的,而第一个进入该分组的KV其实就是前面map排序之后得到的同一订单中价格最高的商品的key,所以将其输出即可。
4、代码实现
OrderBean
package GroupOrder;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.h