繁体   English   中英

比较 Hive 查询与不同连接顺序的效率

[英]Comparing efficiency of Hive queries with different join orders

考虑 Hive 中的以下两个查询:

SELECT
    *
FROM
    A
INNER JOIN 
    B
INNER JOIN
    C
ON 
    A.COL = B.COL
AND A.COL = C.COL

SELECT
    *
FROM
    A
INNER JOIN
    B
ON
    A.COL = B.COL
INNER JOIN
    C
ON
    A.COL = C.COL

问题:这两个查询在计算上是相同的还是不同的? 换句话说,为了获得最快的结果,我应该更喜欢写一个而不是另一个,还是没关系? 谢谢。

在 Hive 1.2 上,也在 Hive 2.3 上进行了测试,两者都在 Tez 上,优化器足够智能,可以得出与表 B 连接的 ON 条件,并执行两个 INNER JOIN,每个都具有正确的自己的 ON 条件。

检查简单查询

with A as (
select stack(3,1,2,3) as id
),
B as (
select stack(3,1,2,3) as id
),
C as (
select stack(3,1,2,3) as id
)

select * from A 
inner join B
inner join C
ON A.id = B.id AND A.id = C.id

解释命令显示两个连接都在单个映射器上作为 map-join 执行,并且每个连接都有自己的连接条件。 这是解释output:

Map 1 File Output Operator [FS_17] Map Join Operator [MAPJOIN_27] (rows=1 width=12) Conds: FIL_24.col0=RS_12.col0(Inner) , FIL_24.col0=RS_14.col0(Inner) ,HybridGraceHashJoin:true, Output:["_col0","_col1","_col2"]

首先我认为它会在第一个查询中与表 B 交叉连接,然后与 C 连接会减少数据集,但两个查询的工作方式相同(相同的计划,相同的执行),这要归功于优化器。

此外,我在关闭 map-join ( set hive.auto.convert.join=false; ) 的情况下进行了相同的测试,并且两个查询的计划也完全相同。 我没有为真正的大桌子测试它,你最好仔细检查一下。

因此,在 Hive 1.2 和 Hive 2.3 上,reducer 上的 map-join 和 merge join 在计算上都是相同的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM