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節點內部,分支節點( |