在MapReduce中,Join操作是一种常见的数据处理方式,用于将两个或多个数据集进行合并,以下是几种MapReduce Join的实例:
单表Join实例
实验目的
1、准确理解MapReduce单表连接的设计原理;
2、熟练掌握MapReduce单表连接程序的编写;
3、了解单表连接的运用场景;
4、学会编写MapReduce单表连接程序代码解决问题。
实验原理
以buyer1(buyer_id, friends_id)表为例,单表连接是指连接左表的buyer_id列和右表的friends_id列,且左表和右表是同一个表,在map阶段,读入数据后,将数据分割成buyer_id和friends_id,然后将buyer_id设置成key,friends_id设置成value,直接输出作为左表;再将同一对buyer_id和friends_id中的friends_id设置成key,buyer_id设置成value进行输出,作为右表,为了区分输出中的左右表,需要在输出的value中加上左右表的信息。
现有某电商的用户好友数据文件,名为buyer1,包含(buyer_id, friends_id)两个字段,内容是以"t"分隔,编写MapReduce进行单表连接,查询出用户的间接好友关系,10001的好友是10002,而10002的好友是10005,那么10001和10005就是间接好友关系。
实验步骤
1、切换到/apps/hadoop/sbin目录下,开启hadoop。
2、在Linux本地新建/data/mapreduce7目录。
3、在Linux中切换到/data/mapreduce7目录下,用wget命令从http://192.168.1.100:60000/allfiles/mapreduce7/buyer1网址上下载文本文件buyer1。
4、首先在hdfs上新建/mymapreduce7/in目录,然后将Linux本地/data/mapreduce7目录下的buyer1文件导入到hdfs的/mymapreduce7/in目录中。
5、新建Java Project项目,项目名为mapreduce7,在mapreduce7项目里新建包,包名为mapreduce,在mapreduce包下新建类,类名为DanJoin。
6、添加项目所需依赖的jar包,右键单击mapreduce7,新建一个文件夹,用于存放项目所需的jar包,将/data/mapreduce7目录下,hadoop2lib目录中的jar包,拷贝到eclipse中mapreduce7项目的hadoop2lib目录下,选中所有项目hadoop2lib目录下所有jar包,并添加到Build Path中。
7、编写Java代码,并描述其设计思路。
Map端Join实例
实验目的
1、熟练掌握Map端join的程序编写;
2、准确理解Map端join的设计原理;
3、了解Map端join的适用场景;
4、学会编写Map端join的程序代码解决实际问题。
实验原理
Map端join是指在数据到达map处理函数之前进行合并的操作,效率要远远高于Reduce端join,因为Reduce端join是把所有的数据都经过Shuffle,非常消耗资源。
Map端join的使用场景:一张表数据十分小、一张表数据很大,Map端join是针对以上场景进行的优化,将小表中的数据全部加载到内存,按关键字建立索引,大表中的数据作为map的输入,对map()函数每一对<key, value>输入,都能够方便地和已加载到内存的小数据进行连接。
某电商平台需要对订单数据进行分析,已知订单数据包括两个文件,分别为订单表orders1和订单明细表order_items1,orders1表记录了用户购买商品的下单数据,order_items1表记录了商品id,订单id以及明细id,它们的表结构以及关系如下图所示。
实验步骤
1、在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeCache中取出该小表进行join连接的 <key, value>键值对,将其解释分割放到内存中(可以放大Hash Map等等容器中)。
2、要重写MyMapper类下面的setup()方法,因为这个方法是先于map方法执行的,将较小表先读入到一个HashMap中。
3、重写map函数,一行行读入大表的内容,逐一的与HashMap中的内容进行比较,若Key相同,则对数据进行格式化处理,然后直接输出。
Reduce端Join实例
实验目的
1、了解reduce端join的适用场景;
2、准确理解reduce端join的设计原理;
3、熟练掌握reduce端join程序代码的编写。
实验原理
在Reduce端进行Join连接是MapReduce框架进行表之间Join操作最为常见的模式,Map端的主要工作是为来自不同表(文件)的key/value对打标签以区别不同来源的记录,然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。
Reduce端Join的使用场景:Reduce端连接比Map端连接更为普遍,因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中,但是Reduce端连接效率比较低,因为所有数据都必须经过Shuffle过程。
实验步骤
1、Map端读取所有的文件,并在输出的内容里加上标识,代表数据是从哪个文件里来的。
2、在Reduce处理函数中,按照标识对数据进行处理。
3、然后将相同的key值进行Join连接操作,求出结果并直接输出。
FAQs
Q1: MapReduce中的Join操作有哪些类型?
A1: MapReduce中的Join操作主要有以下几种类型:
1、单表Join:连接的是同一张表的不同列,常用于查找间接关系。
2、Map端Join:适用于一张表数据很小,另一张表数据很大的情况,通过在Map端缓存小表数据来减少Reduce端的计算压力。
3、Reduce端Join:适用于大多数情况,特别是在无法确定所有join字段的情况下,通过将所有数据经过Shuffle过程后再进行连接。
Q2: 如何在MapReduce中实现Map端Join?
A2: 实现Map端Join的步骤如下:
1、在提交作业时将小表文件放到该作业的DistributedCache中。
2、从DistributeCache中取出小表进行join连接的<key, value>键值对,并将其解释分割放到内存中。
3、重写MyMapper类的setup()方法,将小表读入到HashMap中。
4、重写map函数,一行行读入大表的内容,逐一与HashMap中的内容进行比较,若Key相同,则对数据进行格式化处理并直接输出。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1220286.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复