hive common join &map join

本文详细介绍了Hive中的两种Join操作,包括Common Join和MapJoin的工作原理及适用场景。Common Join在Reduce阶段完成连接,涉及map、shuffle、reduce三个阶段;而MapJoin则在Map阶段完成,适用于小表与大表连接,小表会被加载到内存中以优化性能。此外,文章还提供了配置MapJoin的参数说明以及使用示例。
摘要由CSDN通过智能技术生成

join的种类

hive的join主要分为两类,一个是在reduce阶段完成的common join,另一个是在map阶段完成的map join,即在Map阶段进行表之间的连接。而不需要进入到Reduce阶段才进行连接。这样就节省了在Shuffle阶段时要进行的大量数据传输。从而起到了优化作业的作用。

common join 的简介

使用场景:当未设置map join 或者map join 不满足需求的适合,会自动转为common join,一般会经历map,shuffle,reduce三个阶段:
map阶段:

1:组建关联键组(一个关联键的时候单个key,多个关联键的时候拼成一个组合)
2:列筛选,选择需要的列,并带上表的标签,用以判断字段属于哪张表
3:二次排序,partition排序 决定reduce处理数据(hash取模分区)key排序

Shuffle阶段:

根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样
确保两个表中相同的key位于同一个reduce中

reduce阶段:

根据key的值完成join操作,期间通过表标签来识别不同表中的数据。

案例:

select
a.user_name
,a.department_id
,b.department_name
from user a
left join depart b 
on a.department_id=b.id

实现原理如下:
在这里插入图片描述

map join 的简介

运行原理:

原理为broadcast join,即把小表作为一个完整的驱动表来join,除了一张表中
的数据分布在不同的map中外,其他的表必须完整的在每个map中。mapjoin 将小
表读到内存中,在map阶段直接拿大表的数据和内存中的小表数据做匹配,因为在
map阶段完成了join,故不需要reduce,自然也不需要shuffle

适用场景:

两个要连接的表,必须有一个表很小,小表存放在内存但不影响性能

具体实现

通过参数:set hive.auto.convert.join=true; 一般默认为true
表大小设置:hive.mapjoin.smalltable.filesize=25000000  小表的大小,默认25m,如果表的大小小于此值就会被加载进内存中
		   hive.auto.convert.join.noconditionaltask=true 将普通JOIN转换成MapJoin,并是否将多个MJ合并成一个
		   hive.auto.convert.join.noconditionaltask.size=10000,多个MJ合并成一个MJ时,其表的总的大小须小于该值,
		   同时hive.auto.convert.join.noconditionaltask必须为true

实现原理如下:
在这里插入图片描述

案例:

set hive.auto.convert.join=true
select a.name,b.deptno 
from table a join dept b  on a.name =b.name

在这里插入图片描述

注意事项:

left join 小表放右边
right join 小表放左边
inner join 左右都可
full join 不能用map join
mapjoin 支持小表子查询,子查询需要别名

参考文档:

https://blog.csdn.net/u012036736/article/details/84978689
https://blog.csdn.net/u010010664/article/details/79731044
https://blog.csdn.net/ych0112xzz/article/details/81186204
https://www.cnblogs.com/smartloli/p/4356660.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值