【问题标题】:Hive Map-Join configuration mysteryHive Map-Join 配置之谜
【发布时间】:2025-12-04 19:30:01
【问题描述】:

谁能解释清楚有什么区别

hive.auto.convert.join

hive.auto.convert.join.noconditionaltask

配置参数?

还有这些对应的尺寸参数:

hive.mapjoin.smalltable.filesize

hive.auto.convert.join.noconditionaltask.size

我的观察是在 Tez 上运行时,当 hive.auto.convert.join.noconditionaltask.size 设置为足够高的值时,即使 hive.mapjoin.smalltable.filesize 设置小于小表的大小,Map-Join 也可以工作。

为什么我们两个都需要

hive.auto.convert.joinhive.auto.convert.join.noconditionaltask?

Apache documentation 非常混乱。

【问题讨论】:

    标签: hive query-optimization hiveql mapjoin hive-configuration


    【解决方案1】:

    这些参数用于决定何时在 hive 中使用 Map JoinCommon join,最终影响查询性能。

    Map join 用于连接表之一小到足以放入内存的情况,因此速度非常快。以下是所有参数的解释:

    hive.auto.convert.join

    当此参数设置为true时,Hive会自动检查较小的表文件大小是否大于hive.mapjoin.smalltable.filesize指定的值,如果大于该值则通过common join查询执行。启用自动转换连接后,无需在查询中提供地图连接提示。

    hive.auto.convert.join.noconditionaltask

    当连接涉及三个或更多表时,并且

    hive.auto.convert.join = true - Hive 生成​​三个或更多映射端连接,并假设所有表的大小都较小。

    hive.auto.convert.join.noconditionaltask = true,如果 n-1 表的大小小于 10 MB,hive 会将三个或更多 map-side join 组合成一个 map-side join。这里的大小由hive.auto.convert.join.noconditionaltask.size 定义。

    hive.mapjoin.smalltable.filesize

    这个设置基本上是告诉优化器在你的系统中定义小表的方式。该值为您定义了什么是小表,然后当根据该值执行查询时,它确定连接是否有资格转换为map join

    hive.auto.convert.join.noconditionaltask.size

    大小配置使用户能够控制内存中可以容纳的大小表。该值表示可以转换为适合内存的哈希图的表大小的总和。

    这是一个很好的解释链接,其中包括所有 4 个参数的描述和一个示例:

    http://www.openkb.info/2016/01/difference-between-hivemapjoinsmalltabl.html

    【讨论】:

    • 非常感谢这个链接和解释!
    • 我如何决定我可以给属性hive.mapjoin.smalltable.filesize的最大尺寸