簡體   English   中英

配置單元查詢一直在失敗。 如何最佳地聯接很大的桌子?

[英]Hive queries are constantly failing. How to optimally join very big tables?

我試圖(內部)將HDFS上按“天”(日期)分區的兩個表連接多天(例如2周)。 兩個表都有100列,但是我只想查詢10列。 每天有超過十億行。

我的HIVE查詢如下所示。

INSERT OVERWRITE TABLE join1 partition (day) 
SELECT a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from (
    select x1, x2, x3... xn 
    from table1 
    where day between day1 and day2
) a 
join (
    select x1, y1, y2,... ym, day 
    from table2 where day between day1 and day2
) b 
on a.x1=b.x1;

第一個問題-即使是更短的時間(1-7天),也要花很長時間(12小時以上)才能加入此連接。

第二個問題-每次嘗試超過10天左右都失敗。 它使用了大約504個映射器和250個化簡器,這是默認設置(我也嘗試了500種化簡器)。

故障信息

我知道這個錯誤不是真實的( 什么是Hive:從org.apache.hadoop.hive.ql.exec.MapRedTask返回代碼2 ),但是即使是真正的錯誤也不是很有用(抱歉,我現在無法獲取它) )。

崩潰的原因可能是什么? 誰能建議一種更好的方式加入如此龐大的桌子?

這個評論太長了。

在優化子查詢時,某些數據庫存在問題。 我可以想象這是Hive的問題。 因此,我建議:

select a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from table1 a join
     table2 b 
     on a.x1 = b.x1
where a.day between a.day1 and a.day2 and
      b.day between b.day1 and b.day2;

我也想知道您是否需要on子句中的條件a.day = b.day 在聯接中使用現有分區鍵應有助於提高性能。

關於錯誤:

由於您在join1上使用了動態分區,因此您是否正確設置了可以創建的最大分區數?

關於速度:

您的table1和table2是否這樣定義?

CREATE table1 ( 
  x1 string,
  x2 string,
  :
) PARTITIONED BY ( day int ) 
CLUSTERED BY ( 'x1' ) 
SORTED BY ( x1 ) INTO 400 BUCKETS;

該表是按天划分的,因此訪問任何一天都只需要訪問相應的分區,而不需要訪問整個文件。 這將加快您的內部查詢。 它也使用存儲,因此,當您在x1上執行聯接時,所有具有相同x1值的行都將粘貼在同一位置,這將加快聯接速度,不要介意這么大的增量。 僅當在Map階段進行連接(由於存儲)時,差異才可見。

暫無
暫無

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

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