DataWorks為您提供循環節點(do-while節點),您可根據業務需要重新編排循環節點內部業務流程,將需要循環執行的業務邏輯放入循環節點內部,并通過循環節點內部的End節點來定義循環條件,即確認不滿足何種條件的情況下退出循環。循環節點可單獨使用,也可結合賦值節點來循環遍歷賦值節點傳遞的結果集。本文為您介紹do-while節點的組成與應用邏輯。
背景信息
您可通過以下內容了解循環節點(do-while節點)的使用:
說明 | 相關文檔 |
了解循環節點(do-while節點)的使用限制與注意事項。例如,循環次數上限、如何測試與如何查看日志。 | |
了解循環節點(do-while節點)內部可根據業務需要自定義循環節點內部業務流程,但要求待循環業務流程開始節點需要為自帶的Start節點,業務流程結束節點需要為節點自帶的End節點。 | |
了解循環節點(do-while節點)提供內置變量可獲取每次循環的相關參數,并提供取值案例加強理解。 | |
了解循環節點通過End節點控制是否退出循環,并提供退出循環的End節點代碼示例。 | |
推薦循環節點(do-while節點)典型應用場景。 |
使用限制
僅DataWorks標準版及以上版本支持使用do-while節點。詳情請參見DataWorks各版本詳解。
do-while節點循環次數上限為1024次。
不支持并發執行。即上次循環完成后才可進入下一次循環。
注意事項
維度 | 分類 | 說明 |
循環支持 | 循環次數上限 | do-while節點最多支持循環1024次,End節點控制循環次數時,如果超過了1024次,則運行會報錯。 |
內部節點 | 流程編排 |
|
取值 | 提供內置變量來取上游賦值節點的指定的值。 | |
調試運行 | 任務調試 | DataWorks為標準模式時,不支持在DataStudio界面直接測試運行do-while節點。 如果您想測試驗證do-while節點的運行結果,您需要將包含do-while節點的任務發布提交到開發環境運維中心,在開發環境運維中心頁面運行do-while節點任務。 |
查看日志 | 在運維中心查看do-while節點的執行日志時,您需要右鍵實例,單擊查看內部節點來查看內部節點的執行日志。 | |
上下游依賴 | 依賴設置 | 循環節點可單獨使用,也可結合賦值節點使用,在運維中心執行任務時,選擇補數據功能,并同時選中執行賦值節點與循環節點,單獨運行循環節點將無法獲取到賦值節點傳遞的值。 |
節點組成與流程編排
DataWorks的do-while節點是包含內部節點的一種特殊節點,您在創建完成do-while節點時,同時也自動創建完成了三個內部節點:Start節點(循環開始節點)、Shell節點(循環任務節點)、End節點(循環結束判斷節點),通過內部節點組織成內部節點流程,實現任務的循環運行。如上圖所示:
Start節點
代表循環開始,不承載具體的任務代碼,循環節點內部具體待循環執行的任務節點均需要直接或間接依賴該Start節點,且不支持刪除。
循環邏輯
DataWorks默認為您創建一個Shell類型的內部任務運行節點,您也可以刪除默認的Shell節點,根據實際情況重新構建循環節點內部待循環的業務流程。
通常循環任務的業務流程會與賦值節點、分支節點、歸并節點聯合使用,自定義循環任務節點時,可刪除內部節點間的依賴關系,重新編排循環節點內部業務流程,但需要分別將Start節點、End節點作為do-while節點內部業務流程的首末節點。
End節點
End節點是do-while節點的循環判斷節點,來控制do-while節點循環次數,其本質上是一個賦值節點,輸出
true
和false
兩種字符串,分別代表繼續下一個循環和不再繼續循環。End節點支持使用ODPS SQL、Shell和Python(Python2)三種語言進行循環判斷代碼開發,同時do-while節點為您提供了便利的內置變量,便于您進行End代碼開發。內置變量的介紹請參見內置變量和取值案例,不同語言開發的樣例代碼請參見退出循環示例:End節點代碼樣例。
循環節點內部具體待循環執行的任務節點均需要直接或間接為該End的節點上游,且不支持刪除該節點。
內置變量
通常,do-while節點使用${dag.變量名}格式來獲取變量。DataWorks為您提供了兩個系統內置變量${dag.loopTimes}、${dag.offset};同時,您也可以結合賦值節點,通過${dag.變量名}格式獲取賦值參數值。
系統內置變量
每次任務循環運行時,您可以通過一些內置的變量來獲取當前已循環次數和偏移量。
內置變量
含義
取值
${dag.loopTimes}
當前已循環次數
第一次循環為1、第二次為2、第三次為3…第n次為n。
${dag.offset}
偏移量
第一次循環為0、第二次為1、第三次為2…第n次為n-1。
獲取賦值節點結果
如果您聯合使用了賦值節點,則還可以通過以下方式來獲取賦值參數值和循環變量參數。
說明當do-while節點依賴賦值節點時,您可將賦值節點的本節點輸出參數設置為do-while節點的本節點輸入參數,在do-while節點中獲取賦值節點的結果集與結果集中的指定節點。格式為${dag.變量名},其中,變量名需配置為do-while節點的本節點輸入參數。本文示例定義do-while節點中的
input
參數(即本節點輸入參數)來接收賦值節點結果集,實際使用時,需替換為您真實的參數名稱。內置變量
含義
${dag.input}
上游賦值節點傳遞的數據集。
${dag.input[${dag.offset}]}
循環節點內部獲取當前循環的數據行。
${dag.input.length}
循環節點內部獲取數據集長度。
取值案例
不同賦值語言的賦值節點,其結果集格式存在差異。do-while節點獲取賦值節點結果集時,Shell賦值語言需使用一維數組的方式在代碼中獲取賦值節點傳遞的結果集、或結果集中的指定數據;ODPS SQL賦值語言需使用二維數組的方式在代碼中獲取賦值節點傳遞的結果集、或結果集中的指定數據。詳情請參見賦值節點輸出格式。
案例1:上游賦值節點為Shell語法
節點輸出
上游賦值節點為Shell語法,最后一條輸出結果為
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01
。變量取值
內置變量
第1次循環時取值
第2次循環時取值
${dag.input}
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01
${dag.input[${dag.offset}]}
2021-03-28
2021-03-29
${dag.input.length}
5
${dag.loopTimes}
1
2
${dag.offset}
0
1
案例2:上游賦值節點為ODPS SQL語法
節點輸出
上游賦值節點為ODPS SQL語法,最后一條Select語句查詢出兩條數據:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 | | 0016359814159 | 未知 | 30~40歲 | 巨蟹座 | +----------------------------------------------+
變量取值
內置變量
第1次循環時取值
第2次循環時取值
${dag.input}
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 | | 0016359814159 | 未知 | 30~40歲 | 巨蟹座 | +----------------------------------------------+
${dag.input[${dag.offset}]}
0016359810821,湖北省,30~40歲,巨蟹座
0016359814159,未知,30~40歲,巨蟹座
${dag.input.length}
2
說明二維數組的行數為數據集長度,當前賦值節點輸出的二維數組行數為2。
${dag.input[0][1]}
說明二維數組的第一行第二列的取值。
湖北省
${dag.loopTimes}
1
2
${dag.offset}
0
1
退出循環示例:End節點代碼樣例
End節點支持使用ODPS SQL、Shell和Python(Python2)三種語言進行循環判斷代碼開發,以下為您示例三種不同語言下,典型的代碼樣例。
使用ODPS SQL語言
SELECT CASE
WHEN COUNT(1) > 0 AND ${dag.offset}<= 9
THEN true
ELSE false
END
FROM xc_dpe_e2.xc_rpt_user_info_d where dt='20200101';
End節點示例代碼中將表行數和遷移量與固定值比較,來限制do-while節點整體的循環次數。
使用Shell語言
if [ ${dag.loopTimes} -lt 5 ];
then
echo "True"
else
echo "False"
fi
將循環次數${dag.loopTimes}
和5進行比較,來限制do-while節點整體的循環次數。
例如:第一次循環${dag.loopTimes}
的值為1、第二次為2,以此類推,第五次為5。至此end節點的輸出結果為False,do-while節點退出循環。
使用Python(Python2)語言
if ${dag.loopTimes}<${dag.input.length}:
print True;
else
print False;
# 如果end節點輸出True,則繼續下一個循環。
# 如果end節點輸出False,則終止循環。
代碼中把循環次數${dag.loopTimes}
和賦值節點傳遞的數據集行數進行比較,來限制do-while節點整體的循環次數。
應用場景
與賦值節點聯合使用
do-while節點與賦值節點聯合使用時,典型的應用場景和注意事項如下所示:
注意事項 | 配置案例 | 配置案例 |
使用 |
|
與分支節點、歸并節點聯合應用
與分支節點和歸并節點聯合應用時,典型的應用場景和注意事項如下所示。
應用場景 | 注意事項 |
do-while節點內部需要進行邏輯判斷或者結果遍歷時,此時可以在do-while節點的內部節點中自定義循環任務節點,并使用分支節點( | 在do-while節點內部,分支節點( |