簡體   English   中英

如何提高 Hive TEZ 中的交叉連接性能?

[英]How to Improve Cross Join Performance in Hive TEZ?

我有一個包含 50 億條記錄的蜂巢表。 我希望這 50 億條記錄中的每一條都與硬編碼的 52 條記錄相結合。

為了實現這一點,我正在做一個交叉連接

select * 
from table1 join table 2
ON 1 = 1;

以盡可能高的內存參數運行這需要 5 個小時。

有沒有其他更短或更簡單的方法可以在更短的時間內實現這一目標?

打開地圖連接:

set hive.auto.convert.join=true;

select * 
 from table1 cross join table2;

該表很小(52 條記錄),應該適合內存。 Map-join operator 將小表加載到分布式緩存中,每個 reducer 容器將使用它來處理內存中的數據,比 common-join 快得多。

您的查詢很慢,因為交叉聯接(笛卡爾積)是由一個單一的減速器處理的。 解決方法是強制執行更高的並行性。 一種方法是將查詢轉換為內連接,以便利用地圖端連接優化。

with t1 as (
  selct col1, col2,..., 0 as k from table1
)
,t2 as (
  selct col3, col4,..., 0 as k from table2 
)
selct 
  *
from t1 join t2 
    on t1.k = t2.k 

現在每個表 (CTE) 都有一個名為k的假列,其值為0 所以它的工作方式就像一個交叉連接,而只發生地圖端連接操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM