hivejoin的三种形式
- shuffle join:是hive中的普通的join方式,基于map/reduce实现,join的key通过shuffle汇集到相应的reduce里做join。这种join方式不考虑数据量和数据模型设计,比较耗费资源,是较慢的join策略。
- map join,join时,将小表load到每个节点的内存中,和大表在该节点上的数据进行join,在map端完成join。其中的一个表必须为能完全加载到内存中。这种方式对大表只做单次扫描,速度较快。
- sort-merge-bucket join(smb join):参与join的表必须都是bucket存储,而且大表的bucket数量需要是小表的2倍。这种join方式受益于相同的key预先是bucket到一起的,可以加快join的速度。但由于对表设计有太多限制,故不常用
hive的join连接
left join:
select * from l_join a left join r_join b on (a.id=b.id) where b.id is not null;
cross join:笛卡尔积
left semi join:相当于sql的in操作,跟上on条件右表重复的记录不会出现
join:操作跟上on条件,右表重复的记录也会出现,
mapjoin:
在hive0.11,当表小于25m会默认自动启动该优化,hive.auto.convert.join=true
select /*+mapjoin(a)*/ * from l_join a left join r_join b on (a.id=b.id);
注意:
多表join是尽量把大表放在后面,因为回启动多个mapreduce,前面的结果会放到内存中。