Mapreduce实例(五):Reduce端join

本文介绍了在Hadoop MapReduce中如何实现Reduce端的Join操作。通过一个电商网站订单表与订单明细表的Join查询实例,详细阐述了Map端如何标记数据来源,以及Reduce端如何进行数据处理和Join操作。最终,通过运行MapReduce程序得到查询结果。
摘要由CSDN通过智能技术生成

系统环境

Linux Ubuntu 16.04

jdk-7u75-linux-x64

hadoop-2.6.0-cdh5.4.5

hadoop-2.6.0-eclipse-cdh5.4.5.jar

eclipse-java-juno-SR2-linux-gtk-x86_64

相关知识

在Reudce端进行Join连接是MapReduce框架进行表之间Join操作最为常见的模式。

1.Reduce端Join实现原理

(1)Map端的主要工作,为来自不同表(文件)的key/value对打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。

(2)Reduce端的主要工作,在Reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在map阶段已经打标志)分开,最后进行笛卡尔只就ok了。

2.Reduce端Join的使用场景

Reduce端连接比Map端连接更为普遍,因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中,但是Reduce端连接效率比较低,因为所有数据都必须经过Shuffle过程。

3.本实验的Reduce端Join代码执行流程:

(1)Map端读取所有的文件,并在输出的内容里加上标识,代表数据是从哪个文件里来的。

(2)在Reduce处理函数中,按照标识对数据进行处理。

(3)然后将相同的key值进行Join连接操作,求出结果并直接输出。

任务内容

现有某电商网站两张信息表,分别为订单表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

要求查询在2011-12-15日该电商都有哪些用户购买了什么商品。

结果数据如下:

订单ID  用户ID   下单日期             商品ID
52293	178338	2011-12-15 00:13:07	1016840
52293	178338	2011-12-15 00:13:07	1014040
52294	178341	2011-12-15 00:14:37	1010731
52294	178341	2011-12-15 00:14:37	1014724
52294	178341	2011-12-15 00:14:37	1022245
52294	178341	2011-12-15 00:14:37	1014200
52294	178341	2011-12-15 00:14:37	1001012
52295	178342	2011-12-15 00:18:43	1023399
52295	178342	2011-12-15 00:18:43	1014040
52295	178342	2011-12-15 00:18:43	1021840
52295	178342	2011-12-15 00:18:43	1016840
52296	178343	2011-12-15 00:38:02	1021134
52296	178343	2011-12-15 00:38:02	1021133
52296	178343	2011-12-15 00:38:02	1014040
52296	178343	2011-12-15 00:38:02	1019043

任务步骤

1.切换到/apps/hadoop/sbin目录下,开启Hadoop。

cd /apps/hadoop/sbin  
./start-all.sh  

2.在Linux本地新建/data/mapreduce6目录。

mkdir -p /data/mapreduce6  

3.在Linux中切换到/data/mapreduce6目录下,用wget命令从http://192.168.1.100:60000/allfiles/mapreduce6/orders1和http://192.168.1.100:60000/allfiles/mapreduce6/order_items1网址上下载文本文件orders1,order_items1。

cd /data/mapreduce6
wget http://192.168.1.100:60000/allfiles/mapreduce6/orders1
wget http://192.168.1.100:60000/allfiles/mapreduce6/order_items1

然后在当前目录下用wget命令从http://192.168.1.100:60000/allfiles/mapreduce6/hadoop2lib.tar.gz网址上下载项目用到的依赖包。

wget http://192.168.1.100:60000/allfiles/mapreduce6/hadoop2lib.tar.gz

将hadoop2lib.tar.gz解压到当前目录下。

tar zxvf hadoop2lib.tar.gz  

4.首先在HDFS上新建/mymapreduce6/in目录,然后将Linux本地/data/mapreduce6目录下的orders1和order_items1文件导入到HDFS的/mymapreduce6/in目录中。

hadoop fs -mkdir -p /mymapreduce6/in
hadoop fs -put /data/mapreduce6/orders1 /mymapreduce6/in
hadoop fs -put /data/mapreduce6/order_items1 /mymapreduce6/in

5.打开Eclipse,新建Java Project项目,项目名mapreduce6。
在这里插入图片描述
在mapreduce6下新建包,包名为mapreduce,在mapreduce包下新建类,类名为ReduceJoin。

在这里插入图片描述
6.添加项目所需依赖的jar包,右键单击项目,新建一个目录,用于存放项目所需的jar包。
在这里插入图片描述
将/data/mapreduce6目录下,hadoop2lib目录中的jar包,拷贝到eclipse中mapreduce6项目的hadoop2lib目录下,选中hadoop2lib目录下所有jar包,并添加到Build Path中。
在这里插入图片描述
7.编写程序代码,并描述其设计思路。

(1)Map端读取所有的文件,并在输出的内容里加上标识,代表数据是从哪个文件里来的。

(2)在reduce处理函数中,按照标识对数据进行处理。

(3)然后将相同key值进行join连接操作,求出结果并直接输出。

Mapreduce中join连接分为Map端Join与Reduce端Join,这里是一个Reduce端Join连接。程序主要包括两部分:Map部分和Reduce部分。

Map代码

public static class mymapper extends Mapper<Object, Text, Text, Text>{
   
		@Override
		protected void map(Object key, Text value, Context context)
				throws IOException, InterruptedException {
   
			String filePath = ((FileSplit)context.getInputSplit()).getPath().toString();
			if (filePath.contains("orders1")) {
   
                //获取行文本内容
				String line = value.toString();
                //对行文本内容进行切分
				String[] arr = line.split("\t");
                ///把结果写出去<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值