【hive】join语句优化

Mapjoin

1.场景

Mapjoin是Hive鲜为人知的功能,它允许将表加载到内存中,从而只要在mapper中完全执行(非常快速)的join,而不必使用“map/reduce”步骤。如果您的查询经常依赖于小表联接(例如城市或国家等),则可能会发现使用mapjoins可以大大提高速度。

2.启用

有两种方法可以启用它。

1.是通过使用一个注释,

/ * + MAPJOIN(小表)* /,此C样式注释应放在SELECT之后,它指示Hive将别名(小表)加载到内存中。

SELECT /*+ MAPJOIN(c) */ * FROM orders o JOIN cities c ON (o.city_id = c.id);

2.另一种打开mapjoins的方法是让Hive自动执行。

只需在配置中将hive.auto.convert.join设置为true,Hive就会对小于hive.mapjoin.smalltable.filesize(默认值为25MB)的任何表自动使用mapjoins。

3.缺陷

Mapjoins有一个局限性,即不能在同一表或别名的查询中的不同列上进行联接。

这是有道理的,因为大概Hive在联接中使用的列上使用了一个HashMap键控,而这样的HashMap对于在不同键上的join将毫无用处)。

3.1 绕过缺陷

可以通过限定where条件子查询的子表,进行连接。

SELECT /*+ MAPJOIN(sr) */ COUNT(*)
FROM
(
    select *
    from a
    where source='c'
) g
JOIN
(
    select * from b
    where source='c'
) sr
ON (g.key = sr.key);

参考:https://grisha.org/blog/2013/04/19/mapjoin-a-simple-way-to-speed-up-your-hive-queries/

你可能感兴趣的:(分布式)