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