簡體   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