全部產品
Search
文件中心

DataWorks:do-while節點最佳實務

更新時間:Jun 19, 2024

本文為您介紹通過迴圈的方式依次處理一組資料的每一行的複雜情境。

前提條件

請在操作前,先瞭解do-while節點邏輯,詳情請參見do-while節點邏輯原理介紹

背景資訊

迴圈節點迴圈輸出賦值節點結果集。

  • 需要部署一個上遊節點,能夠把查詢出的資料輸出給下遊節點使用,您可以使用賦值節點實現該條件。

  • 迴圈節點需要能夠擷取上遊賦值節點的輸出,您可以通過配置上下文依賴來實現該條件。

  • 迴圈節點的內部節點需要能夠引用到每一行的資料,增強已有的節點上下文,並額外下發了系統變數${dag.offset},可以幫您快速引用迴圈節點的上下文。

以下以一個具體的案例,為您樣本複雜情境的配置步驟。 複雜案例如上圖所示:

  • 賦值節點輸出一個二維數組,將此二維數組傳遞給do-while迴圈節點。

    二維數組的樣本值為:

    +----------------------------------------------+
    | uid            | region | age_range | zodiac |
    +----------------------------------------------+
    | 0016359810821  | 湖北省 | 30~40歲   | 巨蟹座 |
    | 0016359814159  | 未知   | 30~40歲   | 巨蟹座 |
    +----------------------------------------------+
  • do-while節點的內部節點通過變數來擷取並列印當前迴圈參數、位移量、上遊賦值節點輸入的參數值等。

配置流程

迴圈節點

  1. 配置節點依賴

    do-while節點需要依賴賦值節點。

  2. 賦值結果集

    賦值節點內建的節點上下文輸出參數outputs,需作為do-while迴圈節點的節點上下文輸入參數。

  3. do-while迴圈節點的內部節點擷取參數

    根據業務需求自訂do-while迴圈節點的內部商務程序,並在內部流程的節點中通過變數來擷取所需參數值。

建立並配置賦值節點

核心操作要點為:

  • 賦值代碼與上下文參數:選擇賦值節點的賦值語言,並通過命令定義好賦值節點最終輸出的結果集,賦值節點會將本節點最後一條輸出語句賦值給賦值節點內建的outputs輸出參數。

    說明

    賦值節點的輸出後續需要作為do-while節點本節點輸入。以下代碼僅為測試使用,您無法直接存取圖上代碼中使用的表,您可在瞭解迴圈節點基本使用後,將代碼中的表替換為您空間下已有的表。

    賦值節點

  • 上下遊依賴關係:您可以在商務程序中建立一個賦值節點,並通過連線,配置賦值節點為do-while節點的上遊節點。

詳細操作步驟請參見賦值節點

do-while節點擷取結果集

單擊do-while節點編輯頁面右側的調度配置,在do-while節點的節點上下文地區,單擊添加。設定參數名input取值來源為上遊賦值節點的輸出。

說明

這裡的上下文關係為賦值節點與do-while節點的上下文參數配置,不是內部節點的上下文參數配置。

調度配置

定義迴圈體

雙擊do-while節點名稱,開啟節點的編輯頁面,定義迴圈體。

do-while節點預設有startshellend三個節點,通過編譯Shell節點的代碼,列印迴圈參數。操作核心要點如下。

  • 上下遊依賴:通過連線將內部節點的上下遊關係建立好。複雜案例-內部

  • 迴圈任務代碼:內部的Shell節點的代碼編譯時間,可以聯合內建變數來列印各種迴圈參數。do-while節點可用的內建變數可參見內建變數,Shell節點的參考代碼如下。

    echo '${dag.input}';
    echo '擷取當前迴圈的行資料:'${dag.input[${dag.offset}]};
    
    echo '擷取位移量:'${dag.offset};
    
    echo '擷取迴圈次數:'${dag.loopTimes};
    
    echo '擷取上遊賦值節點_odpssql傳遞的資料集長度:'${dag.input.length};
    
    echo '如果您要取賦值節點傳遞的資料集中某行某列資料,需要按照二維數組方式取值:'${dag.input[0][1]};

定義end節點的迴圈結束條件

可使用do-while節點支援的內建變數來進行迴圈控制。例如,比較變數dag.loopTimes(迴圈次數)和dag.input.length(取值長度)。如果dag.loopTimes小於dag.input.length,輸出True並繼續迴圈。如果不小於,則輸出False並退出迴圈。範例代碼如下。

if ${dag.loopTimes}<${dag.input.length}:
    print True;
else:
    print False;

運行節點並查看結果

進入營運中心後,右鍵節點選擇補資料 > 當前節點及下遊節點,選擇賦值節點和迴圈節點,運行完成後在作業記錄中查看運行結果。

說明
  • 如果您在do-while節點內使用了賦值節點傳遞的值,請在營運中心測試時,同時運行賦值節點和迴圈節點。

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

  • 賦值節點的輸出結果。賦值節點結果

  • 第1次end節點的運行結果。

  • 第2次end節點的運行結果。