[英]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.