全部產品
Search
文件中心

DataWorks:do-while節點邏輯原理介紹

更新時間:Jun 19, 2024

DataWorks為您提供迴圈節點(do-while節點),您可根據業務需要重新編排迴圈節點內部商務程序,將需要迴圈執行的商務邏輯放入迴圈節點內部,並通過迴圈節點內部的End節點來定義迴圈條件,即確認不滿足何種條件的情況下退出迴圈。迴圈節點可單獨使用,也可結合賦值節點來迴圈遍曆賦值節點傳遞的結果集。本文為您介紹do-while節點的組成與應用邏輯。

背景資訊

您可通過以下內容瞭解迴圈節點(do-while節點)的使用:

說明

相關文檔

瞭解迴圈節點(do-while節點)的使用限制與注意事項。例如,迴圈次數上限、如何測試與如何查看日誌。

使用限制注意事項

瞭解迴圈節點(do-while節點)內部可根據業務需要自訂迴圈節點內部商務程序,但要求待迴圈商務程序開始節點需要為內建的Start節點,商務程序結束節點需要為節點內建的End節點。

節點群組成與流程編排

瞭解迴圈節點(do-while節點)提供內建變數可擷取每次迴圈的相關參數,並提供取值案例加強理解。

內建變數取值案例

瞭解迴圈節點通過End節點控制是否退出迴圈,並提供退出迴圈的End節點程式碼範例。

退出迴圈樣本:End節點代碼範例

推薦迴圈節點(do-while節點)典型應用情境。

應用情境1:與賦值節點聯合使用、應用情境2:與分支節點、歸併節點聯合應用

使用限制

  • 僅DataWorks標準版及以上版本支援使用do-while節點。詳情請參見DataWorks各版本詳解

  • do-while節點迴圈次數上限為1024次。

  • 不支援並發執行。即上次迴圈完成後才可進入下一次迴圈。

注意事項

維度

分類

說明

迴圈支援

迴圈次數上限

do-while節點最多支援迴圈1024次,End節點控制迴圈次數時,如果超過了1024次,則運行會報錯。

內部節點

流程編排

  • 自訂迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部商務程序,但需要分別將Start節點End節點作為do-while節點內部商務程序的首末節點。

  • 在do-while節點的內部節點使用分支節點進行邏輯判斷或者結果遍曆時,需要同時使用歸併節點

  • do-while節點的內部節點End節點在代碼開發時,不支援添加註釋。

取值

提供內建變數來取上遊賦值節點的指定的值。

調試運行

任務調試

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節點迴圈次數,其本質上是一個賦值節點,輸出truefalse兩種字串,分別代表繼續下一個迴圈和不再繼續迴圈。

    • 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節點進行迴圈任務時,內部節點的迴圈任務在每一次迴圈時,需要擷取使用上遊節點(up節點)的輸出參數時,此時可以使用賦值節點(assign_node)。

  • 依賴關係

    do-while節點需要依賴上遊賦值節點(assign_node)。

    說明

    如上圖所示,依賴關係是do-while節點依賴賦值節點,而非do-while的內部迴圈任務節點(shell節點)依賴賦值節點。

  • 上下文參數

    • 賦值節點需將輸出參數作為賦值節點(assign_node)的本節點輸出參數

    • do-while的內部迴圈任務節點(shell節點)需將賦值節點的輸出參數添加為本節點輸入參數

      說明

      上下文關係設定,需設定內部的迴圈任務節點,而非do-while節點。

賦值節點配置案例

與分支節點、歸併節點聯合應用

分支節點歸併節點聯合應用時,典型的應用情境和注意事項如下所示。典型應用

應用情境

注意事項

do-while節點內部需要進行邏輯判斷或者結果遍曆時,此時可以在do-while節點的內部節點中自訂迴圈任務節點,並使用分支節點(branch_node)和歸併節點(merge_node)。

在do-while節點內部,分支節點(branch_node)需要和歸併節點(merge_node)同時使用。