在調度任務中,當調度參數返回的標準時間格式無法滿足複雜業務情境(例如擷取月末、季度或自訂時間位移)時,可以通過引擎函數對傳回值進行二次處理,以產生所需的時間格式。處理方式包括在計算節點中直接轉換,或使用賦值節點進行預先處理。
業務情境說明
在資料開發與ETL流程中,任務調度常依賴特定的時間維度,例如按財務周期(上月最後一天)進行月度結算,或按小時、分鐘層級的時間視窗進行增量資料同步。由於調度參數預設返回標準時間格式,無法直接產生這些複雜的、非標準的時間字串,因此需要對其傳回值進行二次處理。
方案說明
調度參數的二次處理主要有兩種方式:在支援Function Compute的節點(如ODPS SQL)內直接處理,或通過賦值節點進行預先處理後傳遞給下遊節點。選擇何種方式取決於目標節點是否支援在代碼內直接執行函數轉換。
直接處理:在ODPS SQL等支援Function Compute的節點中,可直接在代碼內使用引擎函數,對調度參數的傳回值進行轉換。
間接處理:當目標節點(例如部分離線同步節點)不支援在代碼內執行函數轉換時,可添加一個上遊的賦值節點。該賦值節點執行函數轉換,並將其輸出作為上下文參數傳遞給下遊節點。
實施步驟
假設以下各情境中,任務執行個體的定時時間CYCTIME為20250727000500。
情境一:在SQL節點中直接處理傳回值
以ODPS SQL節點為例,ODPS SQL節點支援直接在SQL語句中使用MaxCompute SQL函數處理調度參數。其它SQL節點需參考引擎自身支援的函數類型。
擷取上個月最後一天
擷取yyyymmdd格式的上月最後一天日期,常用於月度資料的分區或結算。
參數配置:配置調度參數,擷取當前任務定時的年月。
last_month=$[yyyy-mm]處理邏輯:在ODPS SQL代碼中,先構造出當月的第一天,然後使用
DATEADD函數減一天,得到上個月的最後一天,並用REPLACE函數去除分隔字元。SELECT REPLACE(DATEADD(date'${last_month}-01',-1,'dd'),'-','');樣本:
last_month參數值為2025-07。經過函數處理後,返回結果為20250630。
擷取當前季度
根據任務定時時間的月份,計算其所屬的季度(1, 2, 3, 4)。
參數配置:配置調度參數,擷取月份。
month=$[mm]處理邏輯:在ODPS SQL代碼中,將月份除以3並向上取整,計算出所屬季度。
SELECT CEIL(CAST('${month}' AS INT)/3);樣本:
month參數值為07。經過函數處理後,返回結果為3。
擷取定時時間前15分鐘的各時間部分
在需要精確時間點進行資料切片的情境中,可擷取相對於定時時間的任意位移時間。
參數配置:通過在調度參數中進行
-15/24/60的數學運算,直接擷取15分鐘前的年、月、日、小時、分鐘。year=$[yyyy-15/24/60]month=$[yyyymm-15/24/60]day=$[yyyymmdd-15/24/60]hour=$[hh24-15/24/60]mi=$[mi-15/24/60]處理邏輯:直接在SQL中引用這些已計算好的參數。
select 'year=${year} month=${month} day=${day} hour=${hour} mi=${mi}';樣本:跨天計算後,返回結果為
year=2025 month=202507 day=20250726 hour=23 mi=50。
情境二:產生用於增量同步處理的時間區間
為需要指定時間區間的離線同步任務產生時間參數,假設這些情境要求時間格式為yyyymmddhh24miss,且要求左開右閉區間。
調度間隔為1天
擷取昨天00:00:00到今天00:00:00的時間區間。
參數配置:分別擷取昨天和今天的日期。
beginDateTime=$[yyyymmdd-1]endDateTime=$[yyyymmdd]處理邏輯:在資料過濾的where條件中拼接字串,補齊時分秒部分。
event_time >= '${beginDateTime}000000' AND event_time < '${endDateTime}000000'樣本:返回結果的起始時間為
20250726000000,結束時間為20250727000000。
調度間隔為1小時
擷取上一小時00:00到當前小時00:00的時間區間。
參數配置:通過數學運算擷取上一個小時和當前小時。
beginDateTime=$[yyyymmddhh24-1/24]endDateTime=$[yyyymmddhh24]處理邏輯:在資料過濾的where條件中拼接字串,補齊分秒部分。
event_time >= '${beginDateTime}0000' AND event_time < '${endDateTime}0000'樣本:返回結果的起始時間為
20250726230000,結束時間為20250727000000。
情境三:通過賦值節點為下遊節點預先處理參數
當目標節點(例如部分離線同步節點)無法直接使用函數處理調度參數時,可採用賦值節點進行預先處理。例如,當離線同步任務需要使用時間戳類型欄位進行增量同步處理時,可按以下流程實現: