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 语法后,已经不经常使用。
代码语言:javascript复制SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key)
它的作用是,当a表的key值,存在于(IN 、Exists)b的key值中时,返回a表的数据。
作用相当于:
代码语言:javascript复制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的表。
代码语言:javascript复制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一致。都是缓存小表数据的一种方式。
代码语言:javascript复制SELECT /* MAPJOIN(b) */ a.key, a.value
FROM a JOIN b ON a.key = b.key