DataWorks功能實踐速覽 05——迴圈與遍歷
簡介:DataWorks功能實踐系列,幫助您解析業務實現過程中的痛點,提高業務功能使用效率!通過往期的介紹,您已經瞭解到在DataWorks上進行任務執行的最關鍵的幾個知識點,其中上期引數透傳中為您介紹了可以將上游節點引數透傳到下游節點的特殊節點——賦值節點,結合賦值節點和其他節點,可實現迴圈或遍歷讀取處理資料的任務。本期為您介紹如何在DataWorks上實現迴圈與遍歷任務。
往期回顧:
- :為您介紹不同場景下可選的資料同步方案。
- :為您介紹進行資料同步時,可使用的資源組與網路連通方案、注意事項。
- :為您介紹DataWorks通過標準模式提供開發環境與生產環境隔離及不同環境的許可權要求。
- :為您介紹如何在DataWorks上實現引數透傳,即把上游任務的引數透傳到下游任務。
通過往期的介紹,您已經瞭解到在DataWorks上進行任務執行的最關鍵的幾個知識點,其中上期引數透傳中為您介紹了可以將上游節點引數透傳到下游節點的特殊節點——賦值節點,結合賦值節點和其他節點,可實現迴圈或遍歷讀取處理資料的任務。本期為您介紹如何在DataWorks上實現迴圈與遍歷任務。
功能推薦:迴圈節點與遍歷節點
在進行資料開發任務編譯的過程中,有時我們可能碰到需要進行迴圈或遍歷的任務場景,DataWorks為您提供兩類特殊節點以滿足此類場景的使用需求。
對比項 |
迴圈節點(do-while節點) |
遍歷節點(for-each節點) |
應用場景 |
根據物件集合的數量逐條讀取並判斷是否滿足迴圈條件,如果滿足則繼續迴圈,如果不滿足則退出迴圈,迴圈次數根據每次迴圈的判斷結果而定,不固定。 |
根據物件集合的數量逐條讀取(遍歷),迴圈次數已知。 |
節點應用 |
您可以重新編排do-while節點內部的業務流程,將需要迴圈執行的邏輯寫在節點內,再編輯end迴圈判斷節點來控制是否退出迴圈。同時您也可以結合賦值節點來迴圈遍歷賦值節點傳遞的結果集。 |
您可以通過for-each節點來迴圈遍歷賦值節點傳遞的結果集。同時您也可以重新編排for-each節點內部的業務流程。 |
通常迴圈節點(do-while節點)與遍歷節點(for-each節點)會與賦值節點聯合使用,將上游節點的輸出通過賦值節點傳遞給下游節點,在下游節點中對上游節點的輸出結果進行迴圈或遍歷。
同時,迴圈節點(do-while節點)與遍歷節點(for-each節點)與其他簡單節點不一致的地方在於,這類邏輯節點自身包含內部節點。以do-while節點為例,一個do-while節點建立完成後,通常會為您自動建立好3個內部節點,同時您也可以將內部節點重新進行內部業務流程和節點內容的編譯。
Part1:迴圈節點(do-while節點)
1.1 節點組成
DataWorks的do-while節點是包含內部節點的一種特殊節點,您在建立完成do-while節點時,同時也自動建立完成了三個內部節點:start節點(迴圈開始節點)、sql節點(迴圈任務節點)、end節點(迴圈結束判斷節點),通過內部節點組織成內部節點流程,實現任務的迴圈執行。
如上圖所示:
- start節點是內部節點的開始節點,不承載具體的任務程式碼。
- sql節點DataWorks預設為您建立好了一個SQL型別的內部任務執行節點,您也可以刪除預設的sql節點後,自定義內部迴圈任務的執行節點。
- 您的迴圈任務是SQL型別的任務,則可以直接雙擊預設的sql節點,進入節點的程式碼開發頁面開發迴圈任務程式碼。
- 您的迴圈任務比較複雜,您可以在內部節點流程中新建其他任務節點,並根據實際情況重新構建節點的執行流程。通常迴圈任務的業務流程會與賦值節點、分支節點、歸併節點聯合使用,典型應用場景說明請參見 。
說明 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為do-while節點內部業務流程的首末節點。
- end節點
- end節點是do-while節點的迴圈判斷節點,來控制do-while節點迴圈次數,其本質上是一個賦值節點,輸出true和false兩種字串,分別代表繼續下一個迴圈和不再繼續迴圈。
- end節點支援使用ODPS SQL、SHELL和Python(Python2)三種語言進行迴圈判斷程式碼開發,同時do-while節點為您提供了便利的內建變數,便於您進行end程式碼開發。內建變數的介紹請參見 和 ,不同語言開發的樣例程式碼請參見 。
1.2 使用限制與注意事項
- 迴圈支援
- 僅DataWorks標準版及以上版本支援使用do-while節點。
- do-while節點最多支援迴圈128次,end節點控制迴圈次數時,如果超過了128次,則執行會報錯。
- 內部節點
- 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為do-while節點內部業務流程的首末節點。
- 在do-while節點的內部節點使用分支節點進行邏輯判斷或者結果遍歷時,需要同時使用歸併節點。
- do-while節點的內部節點end節點在程式碼開發時,不支援添加註釋。
- 調測執行
- DataWorks為標準模式時,不支援在DataStudio介面直接測試執行do-while節點。如果您想測試驗證do-while節點的執行結果,您需要將包含do-while節點的任務釋出提交到運維中心,在運維中心頁面執行do-while節點任務。如果您在do-while節點內使用了賦值節點傳遞的值,請在運維中心測試時,同時執行賦值節點和迴圈節點。
- 在運維中心檢視do-while節點的執行日誌時,您需要右鍵例項,單擊檢視內部節點來檢視內部節點的執行日誌。
1.3 典型應用:與賦值節點聯合使用
do-while節點常常與賦值節點聯合使用,如下圖所示。
與賦值節點聯合使用時:
- 您需要將賦值節點的輸出作為賦值節點的本節點輸入,且與賦值節點做好上下游依賴關係的配置,其他配置注意事項請參見 。
- 與賦值節點聯合使用時,可以使用一些內建變數來獲取當前已迴圈次數、賦值引數值等迴圈變數值,詳情請參見 。
1.4 內建變數
DataWorks的do-while節點,通過內部節點來實現迴圈執行任務,每次任務迴圈執行時,您可以通過一些內建的變數來獲取當前已迴圈次數和偏移量。
內建變數 |
含義 |
取值 |
${dag.loopTimes} |
當前已迴圈次數 |
第一次迴圈為1、第二次為2、第三次為3…第n次為n。 |
${dag.offset} |
偏移量 |
第一次迴圈為0、第二次為1、第三次為2…第n次為n-1。 |
如果您聯合使用了賦值節點,則還可以通過以下方式來獲取賦值引數值和迴圈變數引數。
說明 以下以變數示例中,input是do-while節點中自定義的本節點輸入引數名稱,實際使用時,需替換為您真實的名稱。
內建變數 |
含義 |
${dag.input} |
上游賦值節點傳遞的資料集。 |
${dag.input[${dag.offset}]} |
迴圈節點內部獲取當前迴圈的資料行。 |
${dag.input.length} |
迴圈節點內部獲取資料集長度。 |
1.5 變數取值案例
- 案例1
上游賦值節點為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節點,最後一條select語句查詢出兩條資料:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
此時,各變數的取值如下:
內建變數 |
第1次迴圈時取值 |
第2次迴圈時取值 |
${dag.input} |
|
|
${dag.input[${dag.offset}]} |
0016359810821,湖北省,30~40歲,巨蟹座 |
0016359814159,未知,30~40歲,巨蟹座 |
${dag.input.length} |
2 說明二維陣列的行數為資料集長度,當前賦值節點輸出的二維陣列行數為2。 |
|
${dag.input[0][1] 說明二維陣列的第一行第一列的取值。 |
0016359810821 |
|
${dag.loopTimes} |
1 |
2 |
${dag.offset} |
0 |
1 |
Part2:遍歷節點(for-each節點)
2.1 節點組成
DataWorks的for-each節點是包含內部節點的一種特殊節點,您在建立完成for-each節點時,同時也自動建立完成了三個內部節點:start節點(迴圈開始節點)、sql節點(迴圈任務節點)、end節點(迴圈結束判斷節點),通過內部節點組織成內部節點流程,實現對上游賦值接節點輸出結果的迴圈遍歷。
如上圖所示:
- sql節點DataWorks預設為您建立好了一個SQL型別的內部任務執行節點,您也可以刪除預設的sql節點後,自定義內部迴圈遍歷任務的執行節點。
- 您的迴圈遍歷任務是SQL型別的任務,則可以直接雙擊預設的sql節點,進入節點的程式碼開發頁面開發任務程式碼。
- 您的迴圈遍歷任務比較複雜,您可以在內部節點流程中新建其他任務節點,並根據實際情況重新構建節點的執行流程。
說明 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為for-each節點內部業務流程的首末節點。
- start節點與end節點是內部節點業務流程每次迴圈遍歷的開始節點與結束節點,不承載具體的任務程式碼。
說明 for-each節點的end節點不控制迴圈遍歷的次數,for-each節點的迴圈遍歷次數由上游賦值節點實際輸出控制。
2.2 使用限制與注意事項
- 上下游依賴
for-each遍歷節點需要遍歷賦值節點傳遞的值,所以賦值節點需作為for-each節點的上游節點,for-each節點需要依賴賦值節點。
- 迴圈支援
- 僅DataWorks標準版及以上版本支援使用for-each節點。
- for-each節點最多支援迴圈128次,如果超過了128次,則執行會報錯。實際迴圈遍歷次數由上游賦值節點實際輸出控制。
- 一維陣列型別的輸出,迴圈遍歷次數即為一維陣列元素的個數。例如,賦值節點的賦值語言為SEHLL或Python(Python2)時,輸出結果為一維陣列:2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,則for-each節點會迴圈5次完成遍歷。
- 二維陣列型別的輸出,迴圈遍歷次數即為二維陣列元素的行數。例如,賦值節點的賦值語言為OdpsSQL時,輸出結果為二維陣列:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
則for-each節點會迴圈2次完成遍歷。
- 內部節點
- 您可以刪除for-each節點的內部節點間的依賴關係,重新編排內部業務流程,但需要分別將start節點、end節點分別作為for-each節點內部業務流程的首末節點。
- 在for-each節點的內部節點使用分支節點進行邏輯判斷或者結果遍歷時,需要同時使用歸併節點。
- 調測執行
- DataWorks為標準模式時,不支援在DataStudio介面直接測試執行for-each節點。如果您想測試驗證for-each節點的執行結果,您需要將包含for-each節點的任務釋出提交到運維中心,在運維中心頁面執行for-each節點任務。
- 在運維中心檢視for-each節點的執行日誌時,您需要右鍵例項,單擊檢視內部節點來檢視內部節點的執行日誌。
2.3 典型應用
DataWorks的for-each節點主要用於有迴圈遍歷的場景,且需要與賦值節點聯合使用,將賦值節點作為for-each節點的上游節點,將賦值節點的輸出結果賦值給for-each節點後,一次次迴圈來遍歷賦值節點的輸出結果。
2.4 內建變數
DataWorks的for-each節點每次迴圈遍歷賦值節點的輸出結果時,您可以通過一些內建的變數來獲取當前已迴圈次數和偏移量。
內建變數 |
含義 |
與for迴圈對比 |
${dag.loopDataArray} |
獲取賦值節點的資料集 |
相當於for迴圈中的程式碼結果: data=[] |
${dag.foreach.current} |
獲取當前遍歷值 |
以下面的for迴圈程式碼為例:
|
${dag.offset} |
當前偏移量 (每一次遍歷相對於第一次的偏移量) |
|
${dag.loopTimes} |
獲取當前遍歷次數 |
- |
在您瞭解自己輸出的表結構的情況下,您可以使用如下變數方式,獲取其他變數取值。
其他變數 |
含義 |
${dag.foreach.current[n]} |
上游賦值節點的輸出結果為二維陣列時,每次遍歷時獲取當前資料行的某列的資料。 |
${dag.loopDataArray[i][j]} |
上游賦值節點的輸出結果為二維陣列時,獲取資料集中具體i行j列的資料。 |
${dag.foreach.current[n]} |
上游賦值節點的輸出結果為一維陣列時,獲取具體某列資料。 |
2.5 內建變數取值案例
- 案例1
上游賦值節點為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節點,最後一條select語句查詢出兩條資料:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
此時,各變數的取值如下:
說明 由於輸出結果為二維陣列,陣列行數為2,因此for-each總遍歷次數為2。
內建變數 |
第1次迴圈遍歷的取值 |
第2次迴圈遍歷的取值 |
${dag.loopDataArray} |
|
|
${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 |
本文為阿里雲原創內容,未經允許不得轉載。
簡介:DataWorks功能實踐系列,幫助您解析業務實現過程中的痛點,提高業務功能使用效率!通過往期的介紹,您已經瞭解到在DataWorks上進行任務執行的最關鍵的幾個知識點,其中上期引數透傳中為您介紹了可以將上游節點引數透傳到下游節點的特殊節點——賦值節點,結合賦值節點和其他節點,可實現迴圈或遍歷讀取處理資料的任務。本期為您介紹如何在DataWorks上實現迴圈與遍歷任務。
往期回顧:
- DataWorks 功能實踐速覽01期——資料同步解決方案:為您介紹不同場景下可選的資料同步方案。
- DataWorks 功能實踐速覽02期——獨享資料整合資源組:為您介紹進行資料同步時,可使用的資源組與網路連通方案、注意事項。
- DataWorks 功能實踐速覽03期——生產開發環境隔離:為您介紹DataWorks通過標準模式提供開發環境與生產環境隔離及不同環境的許可權要求。
- DataWorks功能實踐速覽 04期——引數透傳:為您介紹如何在DataWorks上實現引數透傳,即把上游任務的引數透傳到下游任務。
通過往期的介紹,您已經瞭解到在DataWorks上進行任務執行的最關鍵的幾個知識點,其中上期引數透傳中為您介紹了可以將上游節點引數透傳到下游節點的特殊節點——賦值節點,結合賦值節點和其他節點,可實現迴圈或遍歷讀取處理資料的任務。本期為您介紹如何在DataWorks上實現迴圈與遍歷任務。
功能推薦:迴圈節點與遍歷節點
在進行資料開發任務編譯的過程中,有時我們可能碰到需要進行迴圈或遍歷的任務場景,DataWorks為您提供兩類特殊節點以滿足此類場景的使用需求。
對比項 |
迴圈節點(do-while節點) |
遍歷節點(for-each節點) |
應用場景 |
根據物件集合的數量逐條讀取並判斷是否滿足迴圈條件,如果滿足則繼續迴圈,如果不滿足則退出迴圈,迴圈次數根據每次迴圈的判斷結果而定,不固定。 |
根據物件集合的數量逐條讀取(遍歷),迴圈次數已知。 |
節點應用 |
您可以重新編排do-while節點內部的業務流程,將需要迴圈執行的邏輯寫在節點內,再編輯end迴圈判斷節點來控制是否退出迴圈。同時您也可以結合賦值節點來迴圈遍歷賦值節點傳遞的結果集。 |
您可以通過for-each節點來迴圈遍歷賦值節點傳遞的結果集。同時您也可以重新編排for-each節點內部的業務流程。 |
通常迴圈節點(do-while節點)與遍歷節點(for-each節點)會與賦值節點聯合使用,將上游節點的輸出通過賦值節點傳遞給下游節點,在下游節點中對上游節點的輸出結果進行迴圈或遍歷。
同時,迴圈節點(do-while節點)與遍歷節點(for-each節點)與其他簡單節點不一致的地方在於,這類邏輯節點自身包含內部節點。以do-while節點為例,一個do-while節點建立完成後,通常會為您自動建立好3個內部節點,同時您也可以將內部節點重新進行內部業務流程和節點內容的編譯。
Part1:迴圈節點(do-while節點)
1.1 節點組成
DataWorks的do-while節點是包含內部節點的一種特殊節點,您在建立完成do-while節點時,同時也自動建立完成了三個內部節點:start節點(迴圈開始節點)、sql節點(迴圈任務節點)、end節點(迴圈結束判斷節點),通過內部節點組織成內部節點流程,實現任務的迴圈執行。
如上圖所示:
- start節點是內部節點的開始節點,不承載具體的任務程式碼。
- sql節點DataWorks預設為您建立好了一個SQL型別的內部任務執行節點,您也可以刪除預設的sql節點後,自定義內部迴圈任務的執行節點。
- 您的迴圈任務是SQL型別的任務,則可以直接雙擊預設的sql節點,進入節點的程式碼開發頁面開發迴圈任務程式碼。
- 您的迴圈任務比較複雜,您可以在內部節點流程中新建其他任務節點,並根據實際情況重新構建節點的執行流程。通常迴圈任務的業務流程會與賦值節點、分支節點、歸併節點聯合使用,典型應用場景說明請參見典型應用:與賦值節點聯合使用。
說明 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為do-while節點內部業務流程的首末節點。
- end節點
- end節點是do-while節點的迴圈判斷節點,來控制do-while節點迴圈次數,其本質上是一個賦值節點,輸出true和false兩種字串,分別代表繼續下一個迴圈和不再繼續迴圈。
- end節點支援使用ODPS SQL、SHELL和Python(Python2)三種語言進行迴圈判斷程式碼開發,同時do-while節點為您提供了便利的內建變數,便於您進行end程式碼開發。內建變數的介紹請參見內建變數和變數取值案例,不同語言開發的樣例程式碼請參見案例1:end節點程式碼樣例。
1.2 使用限制與注意事項
- 迴圈支援
- 僅DataWorks標準版及以上版本支援使用do-while節點。
- do-while節點最多支援迴圈128次,end節點控制迴圈次數時,如果超過了128次,則執行會報錯。
- 內部節點
- 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為do-while節點內部業務流程的首末節點。
- 在do-while節點的內部節點使用分支節點進行邏輯判斷或者結果遍歷時,需要同時使用歸併節點。
- do-while節點的內部節點end節點在程式碼開發時,不支援添加註釋。
- 調測執行
- DataWorks為標準模式時,不支援在DataStudio介面直接測試執行do-while節點。如果您想測試驗證do-while節點的執行結果,您需要將包含do-while節點的任務釋出提交到運維中心,在運維中心頁面執行do-while節點任務。如果您在do-while節點內使用了賦值節點傳遞的值,請在運維中心測試時,同時執行賦值節點和迴圈節點。
- 在運維中心檢視do-while節點的執行日誌時,您需要右鍵例項,單擊檢視內部節點來檢視內部節點的執行日誌。
1.3 典型應用:與賦值節點聯合使用
do-while節點常常與賦值節點聯合使用,如下圖所示。
與賦值節點聯合使用時:
- 您需要將賦值節點的輸出作為賦值節點的本節點輸入,且與賦值節點做好上下游依賴關係的配置,其他配置注意事項請參見案例2:與賦值節點聯合使用。
- 與賦值節點聯合使用時,可以使用一些內建變數來獲取當前已迴圈次數、賦值引數值等迴圈變數值,詳情請參見內建變數。
1.4 內建變數
DataWorks的do-while節點,通過內部節點來實現迴圈執行任務,每次任務迴圈執行時,您可以通過一些內建的變數來獲取當前已迴圈次數和偏移量。
內建變數 |
含義 |
取值 |
${dag.loopTimes} |
當前已迴圈次數 |
第一次迴圈為1、第二次為2、第三次為3…第n次為n。 |
${dag.offset} |
偏移量 |
第一次迴圈為0、第二次為1、第三次為2…第n次為n-1。 |
如果您聯合使用了賦值節點,則還可以通過以下方式來獲取賦值引數值和迴圈變數引數。
說明以下以變數示例中,input是do-while節點中自定義的本節點輸入引數名稱,實際使用時,需替換為您真實的名稱。
內建變數 |
含義 |
${dag.input} |
上游賦值節點傳遞的資料集。 |
${dag.input[${dag.offset}]} |
迴圈節點內部獲取當前迴圈的資料行。 |
${dag.input.length} |
迴圈節點內部獲取資料集長度。 |
1.5 變數取值案例
- 案例1
上游賦值節點為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節點,最後一條select語句查詢出兩條資料:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
此時,各變數的取值如下:
內建變數 |
第1次迴圈時取值 |
第2次迴圈時取值 |
${dag.input} |
|
|
${dag.input[${dag.offset}]} |
0016359810821,湖北省,30~40歲,巨蟹座 |
0016359814159,未知,30~40歲,巨蟹座 |
${dag.input.length} |
2 說明二維陣列的行數為資料集長度,當前賦值節點輸出的二維陣列行數為2。 |
|
${dag.input[0][1] 說明二維陣列的第一行第一列的取值。 |
0016359810821 |
|
${dag.loopTimes} |
1 |
2 |
${dag.offset} |
0 |
1 |
Part2:遍歷節點(for-each節點)
2.1 節點組成
DataWorks的for-each節點是包含內部節點的一種特殊節點,您在建立完成for-each節點時,同時也自動建立完成了三個內部節點:start節點(迴圈開始節點)、sql節點(迴圈任務節點)、end節點(迴圈結束判斷節點),通過內部節點組織成內部節點流程,實現對上游賦值接節點輸出結果的迴圈遍歷。
如上圖所示:
- sql節點DataWorks預設為您建立好了一個SQL型別的內部任務執行節點,您也可以刪除預設的sql節點後,自定義內部迴圈遍歷任務的執行節點。
- 您的迴圈遍歷任務是SQL型別的任務,則可以直接雙擊預設的sql節點,進入節點的程式碼開發頁面開發任務程式碼。
- 您的迴圈遍歷任務比較複雜,您可以在內部節點流程中新建其他任務節點,並根據實際情況重新構建節點的執行流程。
說明 自定義迴圈任務節點時,您可以刪除內部節點間的依賴關係,重新編排迴圈節點內部業務流程,但需要分別將start節點、end節點分別作為for-each節點內部業務流程的首末節點。
- start節點與end節點是內部節點業務流程每次迴圈遍歷的開始節點與結束節點,不承載具體的任務程式碼。
說明 for-each節點的end節點不控制迴圈遍歷的次數,for-each節點的迴圈遍歷次數由上游賦值節點實際輸出控制。
2.2 使用限制與注意事項
- 上下游依賴
for-each遍歷節點需要遍歷賦值節點傳遞的值,所以賦值節點需作為for-each節點的上游節點,for-each節點需要依賴賦值節點。
- 迴圈支援
- 僅DataWorks標準版及以上版本支援使用for-each節點。
- for-each節點最多支援迴圈128次,如果超過了128次,則執行會報錯。實際迴圈遍歷次數由上游賦值節點實際輸出控制。
- 一維陣列型別的輸出,迴圈遍歷次數即為一維陣列元素的個數。例如,賦值節點的賦值語言為SEHLL或Python(Python2)時,輸出結果為一維陣列:2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01,則for-each節點會迴圈5次完成遍歷。
- 二維陣列型別的輸出,迴圈遍歷次數即為二維陣列元素的行數。例如,賦值節點的賦值語言為OdpsSQL時,輸出結果為二維陣列:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
則for-each節點會迴圈2次完成遍歷。
- 內部節點
- 您可以刪除for-each節點的內部節點間的依賴關係,重新編排內部業務流程,但需要分別將start節點、end節點分別作為for-each節點內部業務流程的首末節點。
- 在for-each節點的內部節點使用分支節點進行邏輯判斷或者結果遍歷時,需要同時使用歸併節點。
- 調測執行
- DataWorks為標準模式時,不支援在DataStudio介面直接測試執行for-each節點。如果您想測試驗證for-each節點的執行結果,您需要將包含for-each節點的任務釋出提交到運維中心,在運維中心頁面執行for-each節點任務。
- 在運維中心檢視for-each節點的執行日誌時,您需要右鍵例項,單擊檢視內部節點來檢視內部節點的執行日誌。
2.3 典型應用
DataWorks的for-each節點主要用於有迴圈遍歷的場景,且需要與賦值節點聯合使用,將賦值節點作為for-each節點的上游節點,將賦值節點的輸出結果賦值給for-each節點後,一次次迴圈來遍歷賦值節點的輸出結果。
2.4 內建變數
DataWorks的for-each節點每次迴圈遍歷賦值節點的輸出結果時,您可以通過一些內建的變數來獲取當前已迴圈次數和偏移量。
內建變數 |
含義 |
與for迴圈對比 |
${dag.loopDataArray} |
獲取賦值節點的資料集 |
相當於for迴圈中的程式碼結果: data=[] |
${dag.foreach.current} |
獲取當前遍歷值 |
以下面的for迴圈程式碼為例:
|
${dag.offset} |
當前偏移量 (每一次遍歷相對於第一次的偏移量) |
|
${dag.loopTimes} |
獲取當前遍歷次數 |
- |
在您瞭解自己輸出的表結構的情況下,您可以使用如下變數方式,獲取其他變數取值。
其他變數 |
含義 |
${dag.foreach.current[n]} |
上游賦值節點的輸出結果為二維陣列時,每次遍歷時獲取當前資料行的某列的資料。 |
${dag.loopDataArray[i][j]} |
上游賦值節點的輸出結果為二維陣列時,獲取資料集中具體i行j列的資料。 |
${dag.foreach.current[n]} |
上游賦值節點的輸出結果為一維陣列時,獲取具體某列資料。 |
2.5 內建變數取值案例
- 案例1
上游賦值節點為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節點,最後一條select語句查詢出兩條資料:
+----------------------------------------------+
| uid | region | age_range | zodiac |
+----------------------------------------------+
| 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 |
| 0016359814159 | 未知 | 30~40歲 | 巨蟹座 |
+----------------------------------------------+
此時,各變數的取值如下:
說明 由於輸出結果為二維陣列,陣列行數為2,因此for-each總遍歷次數為2。
內建變數 |
第1次迴圈遍歷的取值 |
第2次迴圈遍歷的取值 |
${dag.loopDataArray} |
|
|
${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 |