全部產品
Search
文件中心

DataWorks:for-each節點邏輯原理介紹

更新時間:Jun 19, 2024

DataWorks為您提供遍曆節點(for-each節點),您可以通過for-each節點來迴圈遍曆賦值節點傳遞的結果集。同時您也可以重新編排for-each節點內部的商務程序。本文為您介紹for-each節點的組成與應用邏輯。

使用說明

您可通過以下內容瞭解遍曆節點(for-each節點)的使用:

說明

相關文檔

瞭解遍曆節點(for-each節點)的使用情境。

應用情境

說明

僅用於遍曆賦值節點傳遞的結果集。

瞭解遍曆節點(for-each節點)使用限制與注意事項。例如,遍曆次數上限、如何測試與查看日誌。

使用限制注意事項

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

節點群組成與流程編排

瞭解遍曆節點(for-each節點)遍曆次數由賦值節點的輸出決定。

遍曆次數

瞭解遍曆節點(for-each節點)提供的內建變數可擷取每次遍曆的相關值。

內建變數

提供遍曆節點(for-each節點)的變數取值與遍曆次數案例說明。

上遊賦值節點為Shell時取值樣本、上遊賦值節點為ODPS SQL時取值樣本

應用情境

DataWorks的for-each節點主要用於有迴圈遍曆的情境,且需要與賦值節點聯合使用,將賦值節點作為for-each節點的上遊節點,將賦值節點的輸出結果賦值給for-each節點後,一次次迴圈來遍曆賦值節點的輸出結果。

for-each

使用限制

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

  • for-each節點迴圈次數上限為1024次。實際遍曆次數由賦值節點輸出的結果集決定。

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

注意事項

維度

分類

說明

上下遊依賴

依賴設定

for-each遍曆節點需要遍曆賦值節點傳遞的值,所以賦值節點需作為for-each節點的上遊節點,for-each節點需要依賴賦值節點。

遍曆支援

遍曆次數上限

for-each節點最多支援迴圈1024次,如果超過了1024次,則運行會報錯。實際迴圈遍曆次數由上遊賦值節點實際輸出控制。

遍曆次數

由賦值節點輸出的結果集決定。

內部節點

流程編排

  • 您可以刪除for-each節點的內部節點間的依賴關係,重新編排內部商務程序,但需要分別將Start節點End節點作為for-each節點內部商務程序的首末節點。

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

取值

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

調試運行

任務調試

  • DataWorks為標準模式時,不支援在DataStudio介面直接測試回合for-each節點。

    如果您想測實驗證for-each節點的運行結果,您需要將包含for-each節點的任務發布提交到開發環境營運中心,在開發環境營運中心頁面運行for-each節點任務。

  • 請同時執行賦值節點與for-each節點。在營運中心針對周期任務執行補資料操作時,請選擇從賦值節點開始補資料,同時執行賦值節點與for-each遍曆節點,勿單獨執行for-each節點。

查看日誌

在營運中心查看for-each節點的執行日誌時,您需要右鍵執行個體,單擊查看內部節點來查看內部節點的執行日誌。

節點群組成與流程編排

DataWorks的for-each節點是包含內部節點的一種特殊節點,您在建立完成for-each節點時,同時也自動建立完成了三個內部節點:Start節點(迴圈開始節點)、Shell節點(迴圈任務節點)、End節點(迴圈結束判斷節點),通過內部節點群組織成內部節點流程,實現對上遊賦值節點輸出結果的迴圈遍曆。for-each內部節點如上圖所示:

  • Shell節點

    DataWorks預設為您建立了一個Shell類型的內部任務運行節點,您也可以刪除預設的Shell節點,自訂內部迴圈遍曆任務的運行節點。

    • 若迴圈遍曆任務為Shell類型,則可雙擊Shell節點,進入節點的代碼開發頁面開發工作單位代碼。

    • 若迴圈遍曆任務比較複雜,則可在內部節點流程中建立其他任務節點,根據實際情況重新構建節點的運行流程。

      說明

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

  • Start節點End節點

    是內部節點商務程序每次迴圈遍曆的開始節點與結束節點,不承載具體的任務代碼。

    說明

    for-each節點的End節點不控制迴圈遍曆的次數,for-each節點的迴圈遍曆次數由上遊賦值節點實際輸出控制。

遍曆次數

說明

for-each節點迴圈次數上限為1024次。實際遍曆次數由賦值節點輸出的結果集決定。

節點遍曆次數由賦值節點輸出的結果集決定:

  • Shell、Python遍曆次數:按一維數群組類型的輸出,迴圈遍曆次數即為一維數組元素的個數(按逗號切分)。

    例如,賦值節點的賦值語言為Shell或Python(Python2)時,輸出結果為一維數組:2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,則for-each節點會迴圈5次完成遍曆。

  • SQL類型遍曆次數:按二維數群組類型的輸出,迴圈遍曆次數即為二維數組元素的行數。

    例如,賦值節點的賦值語言為ODPS SQL時,輸出結果為二維數組:

    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40歲   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40歲   | 巨蟹座 |
    +----------------------------------------------+

    則for-each節點會迴圈2次完成遍曆。

內建變數

您可通過以下方式在遍曆節點內部各節點擷取遍曆節點外部賦值節點的相關結果集。若遍曆節點內部商務程序中存在賦值節點,您可以通過賦值節點下遊預設取值方式在遍曆節點內部進行取值。賦值節點下遊取值方式請參見賦值節點

DataWorks的for-each節點每次迴圈遍曆賦值節點的輸出結果時,您可以通過一些內建的變數來擷取當前已迴圈次數和位移量。

內建變數

含義

與for迴圈對比

${dag.loopDataArray}

擷取賦值節點的資料集

相當於for迴圈中的代碼結果:

data=[]

${dag.foreach.current}

擷取當前遍曆值

以下面的for迴圈代碼為例:

for(int i=0;i<data.length;i++) {
   print(data[i]);
}
  • data[i]相當於${dag.foreach.current}

  • i相當於${dag.offset}

${dag.offset}

當前位移量(每一次遍曆相對於第一次的位移量)

${dag.loopTimes}

擷取當前遍曆次數

-

在您瞭解自己輸出的表結構的情況下,您可以使用如下變數方式,擷取其他變數取值。

其他變數

含義

${dag.foreach.current[n]}

上遊賦值節點的輸出結果為二維數組時,每次遍曆時擷取當前資料行的某列的資料。

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

上遊賦值節點的輸出結果為二維數組時,擷取資料集中具體i行j列的資料。

${dag.foreach.current[n]}

上遊賦值節點的輸出結果為一維數組時,擷取具體某列資料。

內建變數取值案例

案例1:上遊賦值節點為Shell節點

  • 賦值節點輸出

    上遊賦值節點為Shell節點,最後一條輸出結果為2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01

  • 遍曆節點取值

    說明

    由於輸出結果為一維數組,數組元素個數為5(逗號分隔每個元素),因此for-each總遍曆次數為5。

    內建變數

    第1次迴圈遍曆的取值

    第2次迴圈遍曆的取值

    ${dag.loopDataArray}

    2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01

    ${dag.foreach.current}

    2021-03-28

    2021-03-29

    ${dag.offset}

    0

    1

    ${dag.loopTimes}

    1

    2

    ${dag.foreach.current[3]}

    2021-03-30

案例2:上遊賦值節點為ODPS SQL節點

  • 賦值節點輸出

    上遊賦值節點為ODPS SQL節點,最後一條select語句查詢出兩條資料:

    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40歲   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40歲   | 巨蟹座 |
    +----------------------------------------------+
  • 遍曆節點取值

    說明

    由於輸出結果為二維數組,數組行數為2,因此for-each總遍曆次數為2。

    內建變數

    第1次迴圈遍曆的取值

    第2次迴圈遍曆的取值

    ${dag.loopDataArray}

    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40歲   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40歲   | 巨蟹座 |
    +----------------------------------------------+

    ${dag.foreach.current}

    0016359810821,湖北省,30~40歲,巨蟹座

    0016359814159,未知,30~40歲,巨蟹座

    ${dag.offset}

    0

    1

    ${dag.loopTimes}

    1

    2

    ${dag.foreach.current[0]}

    0016359810821

    0016359814159

    ${dag.loopDataArray[1][0]}

    0016359814159