大量重復邏輯的ETL開發優化
那如何高效解決這種問題呢?
1、傳統數據庫(支持with)
使用with語句將SQL邏輯封裝成一張臨時表,下面的SQL在這張臨時表的基礎上進行計算。這樣只需要進行一次計算多次使用。並且臨時表是在會話內生效,會話關閉後臨時表自動消失。不會影響到其他會話。
2、HIVE
在hive裏也可以使用with語句模擬傳統數據庫操作,但需要註意的是,hive只是將with的腳本封裝,執行的時候並不會創建臨時表。可以想象他是一張視圖表,只記錄了SQL邏輯,不存儲數據。
在XT中如何解決這個問題呢,因為hive不支持會話,我們可以使用創建臨時的數據表的方式來解決。但是防止數據表中的數據混亂,我們要在一個ETL中模擬會話,使用先嘗試刪除,再創建,再刪除的操作流程。
drop table if exists XXX.XXX;
create table XXX.XXX as
select
ETL邏輯
drop table if exists XXX.XXX;
這樣就可以既可以很高效的進行ETL開發,又可以節省計算資源。
但這樣也會帶來一個問題,當我們大量刷數據的時候無法並行刷新,會有多個ETL使用同一張臨時數據表,並且每個任務都會執行一遍刪除操作,很容易造成數據錯亂、鎖表。
這種問題又該如何解決?
方法其實很簡單,我們將ETL的臨時數據表表名後面增加一個變量就可以達到並行的時候每個任務都會有自己的臨時數據表了。
所以完整的創建臨時數據表的開發腳本應該是這樣的:
drop table if exists XXX.XXX_$now.datekey;
create table XXX.XXX_$now.datekey as
select
ETL邏輯
drop table if exists XXX.XXX_$now.datekey;
這種方式適用於那些場景?
數據源數據量大,重復查詢數據源獲取數據
將多個指標列轉至,大量重復編寫查詢腳本
大量重復邏輯的ETL開發優化