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