Hive map-side join和reduce-side join

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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值