Hive多表Join的过程(reduce-side join)
HiveSQL底层要转为MapReduce任务执行,那么当进行多表连接的时候,是如何进行表join的呢?
这里搬运这篇博客的例子:https://blog.csdn.net/qiulinsama/article/details/90299426
现在有两个表:page_view和user表
这两张表都有一个相同的字段userid,根据这个字段可以将两张表连接起来,pv_users表,
SQL命令是:
SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.userid = u.userid);
过程如下:
- 由于连接字段为userid,因此映射的键值对Key就为userid。
- 因为join涉及两张表,来自两个文件(夹),所以需要在map输出的时候进行标记,比如来自第一张表的输出Value就记录为<1, X>,这里的1表示数据来自第一张表。
- 这样经过shuffle以后,相同的Key被输入到同一个reduce函数,最后根据表的标记对Value数据求笛卡尔积,用第一张表的每条记录和第二张表的每条记录连接,输出就是join的结果。
map-side join
我们刚刚可以看到,reduce-side join的过程是在reduce中完成的。而map-side join则顾名思义就是join的动作在map阶段完成, 不必动用reducer.
但是要用上map-side join必须满足的条件是两个join的表, 必须有一个足够小. 小到可以使用 Hadoop的 DistributedCache 功能把小表缓存到各个执行节点上去.
如果一部分输入dataset size比较小的话,可以将这部分数据replicate到所有的map端(利用DistributedCache拷贝到各个map host上),在map task执行的时候,会先将这部分数据(小表)读入memory中,每次在map函数遍历大表的时候,会查找memory中对应相同join key的记录集,然后做join。