全部產品
Search
文件中心

DataWorks:do-while節點

更新時間:May 26, 2026

DataWorks為您提供 do-while 節點,用於實現“先執行、後判斷”的迴圈邏輯。當您需要重複執行一系列任務,直到某個動態條件達成時(例如,輪詢檢查檔案是否存在、分批處理資料直至源頭為空白),do-while 節點是理想的選擇。它允許您在迴圈體內自由編排任務流,並通過一個獨立的“結束”節點來精準控制迴圈的退出。

使用情境

在資料開發中,當您遇到需要根據條件重複執行的情境時,do-while 節點能極大簡化您的工作流程設計。典型情境包括:

  • API 輪詢:迴圈調用一個 API,直到其返回特定狀態(如 SUCCESS),或返回的資料滿足要求。

  • 資料就緒等待:等待上遊某個檔案或資料分區產生。每次迴圈檢查一次,檔案產生後即退出迴圈,繼續下遊任務。

  • 分批資料處理:上遊節點(如賦值節點)一次性提供了一個資料列表(如表名、日期分區),do-while 節點可以逐個處理,直到列表處理完畢。

  • 狀態同步:反覆檢查某個外部服務的狀態,直到狀態變為“可用”或“完成”,再觸發後續的資料同步或處理流程。

適用範圍

  • 版本限制:僅支援DataWorks標準版及以上版本。

  • 許可權限制:RAM帳號已被添加至對應工作空間中,並具有開發空間管理員角色許可權。詳情請參見為工作空間增加空間成員

工作原理

do-while 節點像一個“迴圈容器”,其核心機制是 “先執行,後判斷”

image 開始迴圈體(執行任務)image 結束(判斷條件)

  1. 啟動與執行:迴圈從image節點開始,至少會完整執行一次迴圈體內的所有任務。

  2. 條件判斷:迴圈體執行完畢後,會運行 image 節點。您在此節點中編寫判斷邏輯。

  3. 決策迴圈

    • 如果 image 節點最終輸出字串 True,則開啟新一輪迴圈,返回第1步。

    • 如果 image 節點最終輸出字串 False,則迴圈終止,整個 do-while 節點運行成功。

關鍵特性:無論條件是否成立,迴圈體都會至少執行一次。

節點群組成

雙擊 do-while 節點,進入其內部編排畫布,主要由以下三部分構成:

  • image 開始:迴圈的入口標記,不可編輯或刪除。

  • 迴圈體:一個可自由編排的工作區域。可通過“建立內部節點”添加 Shell、SQL、Python 等多種類型的任務節點,形成需重複執行的商務程序。

  • image 結束:迴圈的判斷節點,本質是一個賦值節點。支援 ODPS SQL、Shell、Python 編寫代碼,最終輸出 TrueFalse 字串以決定是否繼續迴圈。

內建變數

在 do-while 節點的迴圈體和結束節點中,您可以使用以下內建變數擷取當前迴圈狀態及輸入資料:

內建變數

含義

系統內建變數

${dag.loopTimes}

當前是第幾次迴圈,從 1 開始計數。

${dag.offset}

當前迴圈的位移量,從 0 開始。等價於 ${dag.loopTimes} - 1

結合賦值節點使用
(假設輸入參數 input 綁定上遊賦值節點輸出)

${dag.input}

擷取上遊傳入的完整結果集(通常為二維數組)。

${dag.input.length}

擷取結果集的行數(即總元素數量)。

${dag.input[${dag.offset}]}

擷取當前迴圈正在處理的那一行資料,返回格式為逗號分隔的字串(如 "user_A,beijing")。

${dag.input[i][j]}

(僅限二維數組)擷取第 i 行、第 j 列的精確值(索引從 0 開始)。

樣本:${dag.input[0][1]} 可提取第一行第二列的值 "beijing"

注意事項

  • 版本限制:僅 DataWorks 標準版及以上版本支援該功能。

  • 迴圈上限:預設最大迴圈次數為128次,可調整的最大迴圈次數為1024次。超過此限制將導致任務失敗。

  • 執行機制:採用串列執行模式,不支援並發處理;每次迴圈必須完全結束後才啟動下一輪。

  • 調試限制:無法在 Data Studio 頁面直接運行測試。必須先發布工作流程,然後在 營運中心 使用 補資料 功能進行驗證。

  • 依賴傳遞:若依賴上遊賦值節點,請務必從上遊節點開始補資料,確保資料鏈路完整。

  • 流程式控制制:若在迴圈體內使用 分支(Branch)節點,請確保所有分支路徑最終匯聚至 歸併(Merge)節點,避免流程斷裂。

操作步驟:建立一個簡單的迴圈任務

本樣本將引導您建立一個迴圈 5 次的任務,並在每次迴圈中列印當前是第幾次迴圈。

步驟一:配置迴圈體(添加 Shell 節點)

  1. 在您的商務程序中建立一個 do-while 節點。

  2. 雙擊進入節點內部,在“迴圈體”地區單擊 “建立內部節點”,選擇 Shell 節點,並命名為 print_loop_times

  3. 按右鍵該節點,選擇 “開啟節點”

  4. 在代碼編輯器中輸入以下命令:

    # 使用內建變數 ${dag.loopTimes} 擷取當前迴圈次數
    echo "This is loop number: ${dag.loopTimes}"
  5. 單擊儲存表徵圖完成儲存。

步驟二:定義允出準則

  1. 返回 do-while 內部畫布,按右鍵 image 結束 節點,選擇 “開啟節點”

  2. 將語言切換為 Python

  3. 輸入以下 Python 代碼:

    # 當迴圈次數小於5時,輸出True,繼續迴圈
    # 當迴圈次數達到5時,輸出False,退出迴圈
    if ${dag.loopTimes} < 5:
        print True
    else:
        print False
  4. 儲存結束節點。

步驟三:發布、運行與驗證

  1. 返回主工作流程畫布,點擊工具列的 發布 按鈕,發布整個工作流程。

  2. 進入 營運中心,定位到該 do-while 節點。

  3. 按右鍵節點 → 補資料 > 當前節點,啟動一次測試回合。

  4. 待執行個體運行成功後,再次右鍵 → “查看內部節點”

  5. 查看五次迴圈記錄,任意展開某次迴圈(如第5次),右鍵其內部的 print_loop_times 執行個體 → “查看作業記錄”,應可見輸出:

    This is loop number: 5

進階用法:結合賦值節點處理資料列表

這是一個常見且實用的情境:利用 do-while 遍曆並處理上遊賦值節點輸出的資料集。情境說明:上遊一個 ODPS SQL 賦值節點查詢出兩行使用者資訊,do-while 節點對每一行資料進行處理。

步驟一:配置上遊賦值節點

  1. 建立一個 賦值節點(如命名 assign_sql_data),並設為 do-while 的上遊。

  2. 在節點中使用 ODPS SQL 查詢資料:

    SELECT 'user_A', 'beijing'
    UNION ALL
    SELECT 'user_B', 'shanghai';
  3. 儲存節點。其 outputs 參數將輸出一個包含兩行資料的二維數組。

步驟二:配置 do-while 節點消費資料

  1. do-while 節點右側的 “調度配置” 面板中,找到 “本節點輸入參數”

  2. 點擊 “添加”,配置如下參數:

    • 參數名input(可自訂)

    • 取值來源:選擇 assign_sql_data.outputs

  3. do-while迴圈體 中建立一個 Shell 節點,輸入以下指令碼處理當前行:

    # 擷取當前迴圈處理的行資料
    echo "Processing data row: ${dag.input[${dag.offset}]}"
  4. 開啟 image 結束 節點,使用 Python 設定允出準則:

    # 若已執行次數小於資料總行數,則繼續迴圈
    if ${dag.loopTimes} < ${dag.input.length}:
        print True
    else:
        print False
  5. 發布工作流程,並在營運中心 assign_sql_data 節點開始補資料,確保資料正確流入迴圈。

運行成功後,可在日誌中看到兩次迴圈分別處理了 "user_A,beijing""user_B,shanghai"

附錄:do-while 與 for-each-節點的對比

特性

do-while 節點

for-each-節點

核心邏輯

條件驅動:重複執行,直到某個條件不再滿足。

資料驅動:為輸入列表中的每一個元素執行一次。

迴圈次數

不確定,取決於條件何時達成。

確定,等於輸入列表的元素個數。

執行保證

至少執行一次(即使初始條件已不滿足)。

如果輸入為空白,則一次也不執行

適用情境

輪詢、等待、狀態檢查、分批處理直到源為空白。

批量處理已知列表(如同步一組表、處理多個分區)。

控制方式

通過 結束節點 輸出 True / False 控制迴圈繼續與否。

自動遍曆完所有元素後自然結束。