Hive Join方式与优化

2021-01-06 11:07:32 浏览数 (1)

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

0 人点赞