簡體   English   中英

Hive 查詢優化

[英]Hive query optimisation

當源數據文件附加新記錄時,必須每天從 hive 中的外部表執行增量加載到內部表中。 可以根據加載新記錄的時間戳(表中的列load_ts )過濾掉新記錄。 嘗試通過從源表中選擇 load_ts 大於目標表中當前max(load_ts)的記錄來實現這一點,如下所示:

INSERT INTO TABLE target_temp PARTITION (DATA_DT)
SELECT ms.* FROM temp_db.source_temp ms 
JOIN (select max(load_ts) max_load_ts from target_temp) mt
ON 1=1
WHERE
ms.load_ts > mt.max_load_ts;

但是上面的查詢沒有給出所需的輸出。 執行需要很長時間( Map-Reduce 范式不應該是這種情況)。

嘗試了其他場景,比如將max(load_ts)作為變量傳遞,而不是加入。 性能仍然沒有改善。 如果任何人都可以就這種方法中可能不正確的內容以及任何替代解決方案發表見解,那將非常有幫助。

首先,map/reduce 模型並不能保證您的查詢花費更少。 主要思想是它的性能將隨着節點數量線性擴展,但您仍然必須考慮如何做事,比在普通 SQL 中更多。

首先要檢查表是否按時間分區。 如果沒有,它應該就像您每次都閱讀整個表格一樣。 其次,您每次也在整個目標表上計算最大值。 如果你只計算最后一個分區的最大值,你可以讓它更快,所以改變這個

JOIN (select max(load_ts) max_load_ts from target_temp) mt

對此(你沒有寫分區列,所以我假設它被稱為“dt”

JOIN (select max(load_ts) max_load_ts from target_temp WHERE dt=PREVIOUS_DATA_DT) mt

因為我們知道最大 load_ts 將在最后一個分區中。

否則,如果不知道源表的結構,以及兩個表的大小,就像其他人評論的那樣,很難提供幫助。

JOIN 比 WHERE 子句中的變量慢。 但是這里的主要性能問題是您的查詢執行目標表和源表的完整掃描。 我會推薦:

  1. 僅查詢 max(load_ts) 的最新分區。
  2. 啟用統計信息收集和使用

    set hive.compute.query.using.stats=true; set hive.stats.fetch.column.stats=true; set hive.stats.fetch.partition.stats=true; set hive.stats.autogather=true;

計算兩個表的列的統計信息。 統計信息將使諸如選擇 MAX(partition) 或 max(ts) 之類的查詢執行得更快

  1. 如果適用,嘗試將源分區文件放入目標分區文件夾而不是 INSERT(目標和源表分區和存儲格式應啟用此功能)。 例如對於文本文件存儲格式,如果源表分區僅包含行>max(target_partition),它就可以正常工作。 您可以結合使用復制文件方法(對於那些完全包含要插入而無需過濾的行的源分區)和 INSERT(對於包含需要過濾的混合數據的分區)。

  2. Hive 可能會在 INSERT 期間合並您的文件。 此合並階段需要額外的時間並添加額外的階段作業。 檢查 hive.merge.mapredfiles 選項並嘗試將其關閉。

  3. 當然,使用預先計算的變量而不是連接。

通過啟用以下屬性來使用基於成本的優化技術

set hive.cbo.enable=true;
set hive.stats.autogather=true;
set hive.stats.fetch.column.stats=true;
set hive.compute.query.using.stats=true;
set hive.vectorized.execution.enabled=true;
set hive.exec.parallel=true;

還分析表

ANALYZE TABLE temp_db.source_temp COMPUTE STATISTICS [comma_separated_column_list];
ANALYZE TABLE target_temp PARTITION(DATA_DT) COMPUTE STATISTICS;

暫無
暫無

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

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