首页技术文章正文

Hadoop实现join的几种方法【大数据开发面试】

更新时间:2021-01-12 来源:黑马程序员 浏览量:

1577370495235_学IT就到黑马程序员.gif

问题分析

本题主要是考察学员对mapreduce的熟悉程度

核心答案讲解

(1)reduce side join

reduce side join是一种最简单的join方式,其主要思想如下:
在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签 (tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。
在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。

(2)map side join

之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。
Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多 份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。

(3)SemiJoin

SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO。
实现方法很简单:选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到 内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的 key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。

问题扩展

map的join是将一个数据集的数据放入Map集合中,将集合在setup放入到缓存中,所以涉及DistributedCache,因为涉及在内存,所以放入缓存的数据集样本要小,否则不适用,所以这个业务场景比较少。
reduce的join将需要join的数据集都作为map的输入,在map的逻辑中对数据进行标记,reduce中对数据进行合并,需要自定义数据类型


猜你喜欢:

Hadoop与Spark的区别有哪些?【大数据培训】

云计算大数据培训之大数据Hadoop生态圈:Pig(1)

云计算大数据培训之Hadoop组件:zookeeper(1)

黑马程序员大数据培训 

分享到:
在线咨询 我要报名
和我们在线交谈!