Left Semi-Join
Hive支持的Join方式有Inner Join和Outer Join,这和标准SQL一致。除此之外,还支持一种特殊的Join:Left Semi-Join。
Left Semi-Join即左半开连接,Hive使用左半开连接实现 in / exists 语法,在0.13版本推出IN/NOT IN/EXISTS/NOT EXISTS 语法后,已经不经常使用。
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key)
它的作用是,当a表的key值,存在于(IN 、Exists)b的key值中时,返回a表的数据。
作用相当于:
SELECT a.key, a.value
FROM a WHERE a.key in (SELECT b.key FROM B);
StreamTable
Hive在执行Join时,默认会将前面的表直接加载到缓存,后面一张表进行stream处理,即shuffle操作。这样可以减少shuffle过程,因为直接加载到缓存中的表,只需要等待后面stream过来的表数据,而不需要进行shuffle,相当于整体减少了一次shuffle过程。
所以在SQL语句中,大表放在join后面,会有很好的优化效果,或者可以直接标注为StreamTable,来指定进行stream的表。
SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
MapJoin
Hive在执行Join时,可以使用MapJoin,将小表直接加载到Map作业中,以减少Shuffle开销。其实效果与stream table一致。都是缓存小表数据的一种方式。
SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a JOIN b ON a.key = b.key
后话
如果有帮助的,记得点赞、关注。在公众号《数舟》中,可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。
我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。
公众号自取: