java按照商品价格排序,六、MapReduce排序例子--获取价格最高的商品信息

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值