簡體   English   中英

從 JOIN 兩個大表創建視圖

[英]Creating a view from JOIN two massive tables

語境

我有一個大表,比如table_A ,大約有 200 億行和 600 列。 我不擁有這張桌子,但我可以從中讀取。

對於這些列的一小部分,我生成了一些額外的列 (50),我將它們存儲在一個單獨的表中,比如table_B ,因此大約為 200 億 X 50 大。

現在我需要向用戶公開表table_Atable_B的連接,我嘗試了

CREATE VIEW table_AB 
AS 
    SELECT *
    FROM table_A AS ta
    LEFT JOIN table_B AS tb ON (ta.tec_key = tb.tec_key) 

問題是,對於任何簡單的查詢,如SELECT * FROM table_AB LIMIT 2都會因為內存問題而失敗:顯然 Impala 嘗試首先在內存中進行完全連接,這將導致一個 0.5 PB 的表。 因此失敗。

問題

創建這種視圖的最佳方法是什么?

如何指示 SQL 在連接之前執行例如要對table_AB執行的過濾操作?

創建一個新表也不是最理想的,因為這意味着復制table_AB中的數據,使用數百 TB。

我也嘗試過[...] SELECT STRAIGHT_JOIN * [...]但沒有幫助。

創建這種視圖的最佳方法是什么?
由於兩張表都很大,所以會有內存問題。 這里有幾點我會推薦,

  • 假設表 a 和 b 有相同的 tec_key,做一個內連接
  • 保留(較小的)表 b 作為驅動程序。 create vw as select ... from b join a on ... Impala 將驅動程序表存儲在內存中,因此它需要更少的內存。
  • 只選擇所需的列,不要全選。
  • 將過濾器放在視圖中。
  • 如果可以在某些可以均勻分布數據的 dtae/year/region/anything 上執行表 b 中的分區。

如何指示 SQL 在連接之前執行例如要對 table_AB 執行的過濾操作?

  • 您不能確保過濾器在加入之前或之后進行。 確保過濾器提高性能的唯一方法是在過濾器列上有分區。 否則,您可以嘗試先過濾並加入,看看它是否能像這樣提高性能
select ... from b
join ( select ... from a where region='Asia') a on ... -- wont improve much

創建一個新表也不是最理想的,因為這意味着復制 table_AB 中的數據,使用數百 TB。

完全同意這一點。 多張小桌子比一張有 600 列的大桌子要好得多。 因此,創建幾個僅包含必填字段的 stg 表,然后豐富該數據。 它是一個困難的數據集,但沒有人會每天更改 20b 行 - 因此也可以實現某種增量。

暫無
暫無

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

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