DataWorks為您提供 do-while 節點,用於實現“先執行、後判斷”的迴圈邏輯。當您需要重複執行一系列任務,直到某個動態條件達成時(例如,輪詢檢查檔案是否存在、分批處理資料直至源頭為空白),do-while 節點是理想的選擇。它允許您在迴圈體內自由編排任務流,並通過一個獨立的“結束”節點來精準控制迴圈的退出。
使用情境
在資料開發中,當您遇到需要根據條件重複執行的情境時,do-while 節點能極大簡化您的工作流程設計。典型情境包括:
API 輪詢:迴圈調用一個 API,直到其返回特定狀態(如
SUCCESS),或返回的資料滿足要求。資料就緒等待:等待上遊某個檔案或資料分區產生。每次迴圈檢查一次,檔案產生後即退出迴圈,繼續下遊任務。
分批資料處理:上遊節點(如賦值節點)一次性提供了一個資料列表(如表名、日期分區),do-while 節點可以逐個處理,直到列表處理完畢。
狀態同步:反覆檢查某個外部服務的狀態,直到狀態變為“可用”或“完成”,再觸發後續的資料同步或處理流程。
適用範圍
-
版本限制:僅支援DataWorks標準版及以上版本。
-
許可權限制:RAM帳號已被添加至對應工作空間中,並具有開發或空間管理員角色許可權。詳情請參見為工作空間增加空間成員。
工作原理
do-while 節點像一個“迴圈容器”,其核心機制是 “先執行,後判斷”。
開始 → 迴圈體(執行任務) →
結束(判斷條件)
啟動與執行:迴圈從
節點開始,至少會完整執行一次迴圈體內的所有任務。條件判斷:迴圈體執行完畢後,會運行
節點。您在此節點中編寫判斷邏輯。決策迴圈:
如果
節點最終輸出字串 True,則開啟新一輪迴圈,返回第1步。如果
節點最終輸出字串 False,則迴圈終止,整個 do-while 節點運行成功。
關鍵特性:無論條件是否成立,迴圈體都會至少執行一次。
節點群組成
雙擊 do-while 節點,進入其內部編排畫布,主要由以下三部分構成:
開始:迴圈的入口標記,不可編輯或刪除。迴圈體:一個可自由編排的工作區域。可通過“建立內部節點”添加 Shell、SQL、Python 等多種類型的任務節點,形成需重複執行的商務程序。
結束:迴圈的判斷節點,本質是一個賦值節點。支援 ODPS SQL、Shell、Python 編寫代碼,最終輸出 True或False字串以決定是否繼續迴圈。
內建變數
在 do-while 節點的迴圈體和結束節點中,您可以使用以下內建變數擷取當前迴圈狀態及輸入資料:
內建變數 | 含義 |
系統內建變數 | |
| 當前是第幾次迴圈,從 1 開始計數。 |
| 當前迴圈的位移量,從 0 開始。等價於 |
結合賦值節點使用 | |
| 擷取上遊傳入的完整結果集(通常為二維數組)。 |
| 擷取結果集的行數(即總元素數量)。 |
| 擷取當前迴圈正在處理的那一行資料,返回格式為逗號分隔的字串(如 |
| (僅限二維數組)擷取第 |
樣本:${dag.input[0][1]}可提取第一行第二列的值"beijing"。
注意事項
版本限制:僅 DataWorks 標準版及以上版本支援該功能。
迴圈上限:預設最大迴圈次數為128次,可調整的最大迴圈次數為1024次。超過此限制將導致任務失敗。
執行機制:採用串列執行模式,不支援並發處理;每次迴圈必須完全結束後才啟動下一輪。
調試限制:無法在 Data Studio 頁面直接運行測試。必須先發布工作流程,然後在 營運中心 使用 補資料 功能進行驗證。
依賴傳遞:若依賴上遊賦值節點,請務必從上遊節點開始補資料,確保資料鏈路完整。
流程式控制制:若在迴圈體內使用 分支(Branch)節點,請確保所有分支路徑最終匯聚至 歸併(Merge)節點,避免流程斷裂。
操作步驟:建立一個簡單的迴圈任務
本樣本將引導您建立一個迴圈 5 次的任務,並在每次迴圈中列印當前是第幾次迴圈。
步驟一:配置迴圈體(添加 Shell 節點)
在您的商務程序中建立一個
do-while節點。雙擊進入節點內部,在“迴圈體”地區單擊 “建立內部節點”,選擇 Shell 節點,並命名為
print_loop_times。按右鍵該節點,選擇 “開啟節點”。
在代碼編輯器中輸入以下命令:
# 使用內建變數 ${dag.loopTimes} 擷取當前迴圈次數 echo "This is loop number: ${dag.loopTimes}"單擊儲存表徵圖完成儲存。
步驟二:定義允出準則
返回 do-while 內部畫布,按右鍵
結束 節點,選擇 “開啟節點”。將語言切換為 Python。
輸入以下 Python 代碼:
# 當迴圈次數小於5時,輸出True,繼續迴圈 # 當迴圈次數達到5時,輸出False,退出迴圈 if ${dag.loopTimes} < 5: print True else: print False儲存結束節點。
步驟三:發布、運行與驗證
返回主工作流程畫布,點擊工具列的 發布 按鈕,發布整個工作流程。
進入 營運中心,定位到該
do-while節點。按右鍵節點 → 補資料 > 當前節點,啟動一次測試回合。
待執行個體運行成功後,再次右鍵 → “查看內部節點”。
查看五次迴圈記錄,任意展開某次迴圈(如第5次),右鍵其內部的
print_loop_times執行個體 → “查看作業記錄”,應可見輸出:This is loop number: 5
進階用法:結合賦值節點處理資料列表
這是一個常見且實用的情境:利用 do-while 遍曆並處理上遊賦值節點輸出的資料集。情境說明:上遊一個 ODPS SQL 賦值節點查詢出兩行使用者資訊,do-while 節點對每一行資料進行處理。
步驟一:配置上遊賦值節點
建立一個 賦值節點(如命名
assign_sql_data),並設為do-while的上遊。在節點中使用 ODPS SQL 查詢資料:
SELECT 'user_A', 'beijing' UNION ALL SELECT 'user_B', 'shanghai';儲存節點。其
outputs參數將輸出一個包含兩行資料的二維數組。
步驟二:配置 do-while 節點消費資料
在
do-while節點右側的 “調度配置” 面板中,找到 “本節點輸入參數”。點擊 “添加”,配置如下參數:
參數名:
input(可自訂)取值來源:選擇
assign_sql_data.outputs
在
do-while的 迴圈體 中建立一個 Shell 節點,輸入以下指令碼處理當前行:# 擷取當前迴圈處理的行資料 echo "Processing data row: ${dag.input[${dag.offset}]}"開啟
結束 節點,使用 Python 設定允出準則:# 若已執行次數小於資料總行數,則繼續迴圈 if ${dag.loopTimes} < ${dag.input.length}: print True else: print False發布工作流程,並在營運中心 從
assign_sql_data節點開始補資料,確保資料正確流入迴圈。
運行成功後,可在日誌中看到兩次迴圈分別處理了 "user_A,beijing" 和 "user_B,shanghai"。
附錄:do-while 與 for-each-節點的對比
特性 | do-while 節點 | for-each-節點 |
核心邏輯 | 條件驅動:重複執行,直到某個條件不再滿足。 | 資料驅動:為輸入列表中的每一個元素執行一次。 |
迴圈次數 | 不確定,取決於條件何時達成。 | 確定,等於輸入列表的元素個數。 |
執行保證 | 至少執行一次(即使初始條件已不滿足)。 | 如果輸入為空白,則一次也不執行。 |
適用情境 | 輪詢、等待、狀態檢查、分批處理直到源為空白。 | 批量處理已知列表(如同步一組表、處理多個分區)。 |
控制方式 | 通過 結束節點 輸出 | 自動遍曆完所有元素後自然結束。 |