DataWorks功能实践速览 05——循环与遍历
往期回顧:
- 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} | +----------------------------------------------+ | 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] 說明 二維數組的第一行第一列的取值。 | 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循環代碼為例: for(int i=0;i<data.length;i++) { print(data[i]); }
|
${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} | +----------------------------------------------+ ?| 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 | |
原文鏈接:https://developer.aliyun.com/article/793529?
版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。總結
以上是生活随笔為你收集整理的DataWorks功能实践速览 05——循环与遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开放搜索查询分析服务架构解读
- 下一篇: PaddlePaddle:在 Serve