比较具有不同连接顺序的 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 上,优化器足够智能,可以导出与 table B 连接的 ON 条件,并执行两个 INNER JOIN,每个 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
Explain 命令显示两个连接都在单个映射器上作为 map-join 执行,并且每个连接都有自己的连接条件。这是解释输出:
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"]
首先我认为它会在第一个查询中与 table B 交叉连接,然后与 C 连接将减少数据集,但两个查询工作相同(相同的计划,相同的执行),感谢优化器。
我还在关闭 map-join 的情况下进行了相同的测试 (set hive.auto.convert.join=false;
),并且两个查询的计划也完全相同。我没有测试它真的很大 tables,你最好仔细检查一下。
因此,对于 reducer 上的 map-join 和 merge join,Hive 1.2 和 Hive 2.3 在计算上都是相同的
考虑 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 上,优化器足够智能,可以导出与 table B 连接的 ON 条件,并执行两个 INNER JOIN,每个 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
Explain 命令显示两个连接都在单个映射器上作为 map-join 执行,并且每个连接都有自己的连接条件。这是解释输出:
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"]
首先我认为它会在第一个查询中与 table B 交叉连接,然后与 C 连接将减少数据集,但两个查询工作相同(相同的计划,相同的执行),感谢优化器。
我还在关闭 map-join 的情况下进行了相同的测试 (set hive.auto.convert.join=false;
),并且两个查询的计划也完全相同。我没有测试它真的很大 tables,你最好仔细检查一下。
因此,对于 reducer 上的 map-join 和 merge join,Hive 1.2 和 Hive 2.3 在计算上都是相同的