【hive】join语句优化

    技术2022-07-11  107

    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/

    Processed: 0.009, SQL: 10