任务描述
本关任务:根据用户行为数据,编写 MapReduce 程序来统计出商品点击量排行。
相关知识
排序概述
在 MapReduce 的 Shuffle 的过程中执行了三次排序,分别是:
map 中的溢写阶段:根据分区以及 key 进行快速排序。
map 中合并溢写文件:将同一分区的多个溢写文件进行归并排序,合成一个大的溢写文件。
reduce 输入阶段:将同一分区,来自不同 map task 的数据文件进行归并排序。
在 MapReduce 整个过程中,默认是会对输出的键值对按照 key 进行排序的,而且是使用快速排序。map 输出的排序的,其实也就是上面的溢写过程中的排序。reduce 输出的排序,即 reduce 处理完数据后,MapReduce内部会自动对输出的键值对按照key进行排序。
数据文件格式说明
这是编程中用到的电商数据,为 CSV 格式,文件名user_behavior.csv,大小9948行,前几行示例如下:
1002309,1008608,手机,pv
1002573,1009007,耳机,pv
1001541,1008614,手机,pv
1001192,1008612,手机,pv
1001016,1008909,平板电脑,buy
1001210,1008605,手机,pv
1001826,1008704,笔记本,pv
1002208,1008906,平板电脑,pv
1002308,1008702,笔记本,pv
1002080,1008702,笔记本,cart
1001525,1008702,笔记本,cart
1002749,1008702,笔记本,pv
1002134,1008704,笔记本,cart
1002497,1008608,手机,pv
···
---总共 9948行---
每一行数据(4列)分别表示: 用户id, 商品id, 商品类别, 用户行为;
商品类别有 手机、平板电脑、笔记本、智能手表、耳机,总共5大类别;
用户行为中pv代表点击浏览,cart代表加入购物车,fav代表添加到喜欢,buy代表购买。
商品点击量排行
即统计出每个商品id中用户行为是pv(点击浏览)的数量,reduce的输出最后是按点击量的大小从大到小排序。
cleanup()方法
编程中可能会用到 cleanup() 方法,cleanup 方法是 mapper/reduce 对象执行完所有的 map/reduce 方法之后最后执行的方法,可用于清理资源释放或清理工作;默认继承的父类方法为空,什么也不做。
编程要求
根据提示,在右侧编辑器补充代码,计算得出商品点击量排行。
main 方法已给出,其中 Job 和输入输出路径已配置完成,无需更改;
map 和 reduce 的输入输出 key、value 已给出;
编程中直接写 map 与 reduce 过程的主要内容即可。
预期输出格式(按点击量从大到小):
商品id,点击量
商品id,点击量
···
···
测试说明
平台会对你编写的代码进行测试,如果编写的 MapReduce 输出与预期一致,则通过。
注:出于显示原因,网页端的 mapreduce 的输出结果中制表符统一用逗号代替显示,但在实际 reduce 结果中 key\value 仍是原样制表符分割,这只是显示上的变化,不影响编程与评测结果。
开始你的任务吧,祝你成功!
创作不易,如果能解决您的问题,麻烦您点赞、收藏+关注,一键三连!!!
package educoder;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* UserLoseDriver
*/
public class ItemClickRankDriver {
public static class ThisMap extends Mapper