暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MapReduce-原理剖析之join

码农大腿哥 2021-03-13
1570
前言:

写过sql的朋友应该有知道,join是一种常用的操作。将两张表join后,就能同时取两张表的数据了

那么,MapReduce是如何实现join的呢?
本篇目标:

1.掌握Reduce Join与Map Join的运行机制



01

Reduce Join

两张表能够join需要公共的字段。假设有两张表如下图所示,它们通过用户id可以关联到一起


关联以后,就可以查到订单对应的用户收货信息了。那么mapReduce是如何实现join的呢?

1.reduce join原理

原理是将公共字段作为key,其余字段作为value。然后将两张表相同key的数据传输到reduce进行join

具体流程如下:

1)设置map的输出格式

map()方法输出时,将公共字段用户id设置为key,其它字段作为value


然后对数据进行排序,排序后的数据进入不同分区,发到不同的reduceTask


2)reduceTask

将两个表设置成两个集合,循环遍历oeder集合,将user表中的收货地址赋值给order表




02

Map Join

在reduce join的情况下,数据要汇总到reduceTask进行join。这种方式很容易产生数据倾斜,比如有些用户购买力强,一个人下很多订单


所以我们考虑,是不是能让数据在map端就进行join,减轻reduce端的压力


1.map Join原理


map join时,文件被切片分成了几块,如果直接进行join肯定会有数据缺失,所以无法直接join

一个解决方案是把小表缓存下来,每个mapTask都保留一份

使用了Map Join后,首先会将小表缓存到集合中;然后将小表与大表进行Join;最后,map()方法直接输出结果,不用启动reduceTask

2.注意事项

Map Join适用于一张表很小、一张表很大的场景



你学废了吗?

— END  —


文章转载自码农大腿哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论