【Hadoop】MapJoin和ReduceJoin的应用实例

需求

两张表Order.txt和pd.txt, 表结构如下。需要用MapReduce的方法,通过pid连接,生成的表结构为 (id,pname,amount)

[Order.txt]
id,pid,amount
1001,01,1
1002,02,2
1003,03,3
1004,01,4
1005,02,5
1006,03,6
[pd.txt]
pid,pname
01,小米
02,华为
03,格力

方法一:ReduceJoin

思路:
主要是在Reduce端处理表间连接
TableBean.java: 序列化TableBean对象存储(pid,id,pname,amount,fileflag)属性
TableMapper.java: 逐行读取Order.txt和pd.txt, 用split(“,”)转换成字符串数组,分别将数组里的值赋给TableBean对象,对于没有的属性分别赋“”或0,fileflag通过context.getInputSplit()方法获取切片信息中的filename
TableReducer.java: 首先创建一个orderBeans集合,用于存储order信息,创建pdBean用于存储pd信息,后续针对ReduceTask(一个Key执行一次ReduceTask)里的每一个orderBean,传入pdBean.name
TableDriver.java: 驱动类

方法二:MapJoin

思路:
由于Reduce端处理过多的表,容易产生数据倾斜,而在Map端先缓存,提前处理表间连接可以减少Reduce端数据的压力。适合大表与小表的关联。
TableBean.java: 序列化TableBean对象存储(pid,id,pname,amount,fileflag)属性。(也可以不用序列化,直接用Text对象存储Mapper output key)
TableMapper.java: 在setup方法中把缓存中的pd推进HashMap里,在map方法中逐行读取order信息,pdname根据pid作为key去HashMap里找value
TableDriver.java: 驱动类,需要添加以下代码

        //将pd.txt添加到缓存中
        job.addCacheFile(new URI("file:///D:/hadoop/hdfs-learn/HadoopLearn/src/main/resources/TableMapJoin/pd.txt"));
        //不需要Reduce端的操作
        job.setNumReduceTasks(0);
        //***skip***
        //从磁盘读取Order.txt
        FileInputFormat.setInputPaths(job,new Path("src/main/resources/TableMapJoin/Order.txt"));

项目代码

MapReduce-Join-Example

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值