hadoop学习笔记(六)MapReduce常见实例三:Join操作(Map端join、Reduce端join、单表join)

本文详细介绍了在Hadoop MapReduce中执行Join操作的三种方式:Map端Join、Reduce端Join和单表Join。通过具体的任务描述、流程分析和代码展示,阐述了各种Join的实现原理和适用场景,帮助读者理解MapReduce中的数据连接处理。
摘要由CSDN通过智能技术生成

目录

什么是join?

Map端Join

任务描述

流程分析

代码

执行结果

Reduce端Join

任务描述

流程分析

代码

执行结果

单表Join

任务描述

流程分析

代码

执行结果


什么是join?

 

Map端Join

MapReduce提供了表连接操作其中包括Map端join、Reduce端join还有单表连接,现在我们要讨论的是Map端join,Map端join是指数据到达map处理函数之前进行合并的,效率要远远高于Reduce端join,因为Reduce端join是把所有的数据都经过Shuffle,非常消耗资源。

1.Map端join的使用场景:一张表数据十分小、一张表数据很大。

Map端join是针对以上场景进行的优化:将小表中的数据全部加载到内存,按关键字建立索引。大表中的数据作为map的输入,对map()函数每一对<key,value>输入,都能够方便地和已加载到内存的小数据进行连接。把连接结果按key输出,经过shuffle阶段,reduce端得到的就是已经按key分组并且连接好了的数据。

为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:

(1)用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中9000是自己配置的NameNode端口号)。JobTracker在作业启动之前会获取这个URI列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。

(2)用户使用DistributedCache.getLocalCacheFiles()方法获取文件目录,并使用标准的文件读写API读取相应的文件。

任务描述

现有订单表orders1和订单明细表order_items1,orders1表记录了用户购买商品的下单数据,order_items1表记录了商品id,订单id以及明细id,它们的表结构以及关系如下图所示:

数据内容如下:

orders1表

订单ID   订单号          用户ID    下单日期
52304	111215052630	176474	2011-12-15 04:58:21
52303	111215052629	178350	2011-12-15 04:45:31
52302	111215052628	172296	2011-12-15 03:12:23
52301	111215052627	178348	2011-12-15 02:37:32
52300	111215052626	174893	2011-12-15 02:18:56
52299	111215052625	169471	2011-12-15 01:33:46
52298	111215052624	178345	2011-12-15 01:04:41
52297	111215052623	176369	2011-12-15 01:02:20
52296	111215052622	178343	2011-12-15 00:38:02
52295	111215052621	178342	2011-12-15 00:18:43
52294	111215052620	178341	2011-12-15 00:14:37
52293	111215052619	178338	2011-12-15 00:13:07

order_items1表

明细ID  订单ID   商品ID
252578	52293	1016840
252579	52293	1014040
252580	52294	1014200
252581	52294	1001012
252582	52294	1022245
252583	52294	1014724
252584	52294	1010731
252586	52295	1023399
252587	52295	1016840
252592	52296	1021134
252593	52296	1021133
252585	52295	1021840
252588	52295	1014040
252589	52296	1014040
252590	52296	1019043

要求用Map端Join来进行多表连接,查询在2011-12-15日都有哪些用户购买了什么商品。(假设orders1文件记录数很少,order_items1文件记录数很多)

 

流程分析

(1)首先在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeCache中取出该小表进行join连接的 <key ,value>键值对,将其解释分割放到内存中(可以放大Hash Map等等容器中)。

(2)要重写MyMapper类下面的setup()方法,因为这个方法是先于map方法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值