當您需要將上遊節點任務的查詢或輸出結果提供給下遊節點使用時,可通過賦值節點實現。賦值節點(即上遊節點)支援 ODPS SQL、Python 2和Shell三種語言,會自動將最後一條查詢或輸出結果賦值給節點內建的輸出參數(outputs),下遊節點可以通過引用該參數來擷取賦值節點的輸出結果。
適用範圍
版本限制:僅支援 DataWorks 標準版及以上版本。
許可權限制:RAM 帳號需被添加至對應工作空間,並具備相應開發許可權。
核心概念:參數的傳遞與引用
賦值節點的核心是參數傳遞,負責將上遊節點產生的資料傳遞給下遊節點。
上遊賦值節點:負責產生資料。它會將最後一條輸出或查詢結果自動賦值給一個名為
outputs的節點輸出參數。下遊業務節點:負責接收和使用資料。通過在下遊節點的調度配置 > 節點上下文中添加一個本節點輸入參數(例如,
sql_inputs),並讓它引用上遊節點的outputs參數,就可以在代碼中使用這些資料。
傳遞參數格式說明
賦值語言 | 傳遞參數範圍 | 傳遞參數格式 |
ODPS SQL | 擷取最後一行 | 將輸出結果作為一個二維數組傳遞至下遊。 |
Python 2 | 擷取最後一行 | 將輸出結果轉化成字串基於逗號( |
Shell | 擷取最後一行 |
操作步驟
下面以將 ODPS SQL 賦值節點的結果傳遞給 Shell 節點為例,介紹通用的操作流程。
建立並配置上遊賦值節點。
登入 DataWorks 控制台,在左側導覽列單擊資料開發與營運 > 資料開發,進入資料開發頁面。
在商務程序中,建立並編輯一個賦值節點。在代碼編輯頁面,選擇賦值語言為 ODPS_SQL,並編寫代碼以產生需要傳遞給下遊的結果。
select * from xc_dpe_e2.xc_rpt_user_info_d where dt='20191008' limit 10;(可選)單擊頁面右側的調度配置,在節點上下文中可以查看到,系統已自動為該節點建立了名為
outputs的本節點輸出參數。
配置下遊 Shell 節點。
說明僅以Shell節點為例,支援任意節點作為下遊節點。
建立 Shell 節點,並將其設定為賦值節點的下遊(即在工作流程中從賦值節點拉線串連到 Shell 節點)。
在 Shell 節點的編輯頁面,單擊右側的調度配置,選擇節點上下文頁簽。
在本節點輸入參數地區,單擊添加參數。
在彈出的對話方塊中,選擇上遊賦值節點的輸出參數
outputs,並為當前節點的輸入參數自訂一個參數名稱(例如:sql_inputs)。配置完成後,下遊節點會自動與上遊賦值節點建立依賴關係。
完成參數配置後,即可在下遊 Shell 節點的代碼中通過
${sql_inputs}的格式來使用上遊傳遞過來的值。echo '${sql_inputs}'; echo '取上遊sql節點輸出第1行資料'${sql_inputs[0]}; echo '取上遊sql節點輸出第1行第2個欄位'${sql_inputs[0][1]};工作原理說明:請注意,您在代碼中使用的
${...}變數訪問文法(包括數組索引)是由 DataWorks 在任務執行前進行預先處理和靜態替換的。例如,${sql_inputs[0][1]}會被 DataWorks 引擎直接替換為從上遊節點擷取到的具體值,然後才將最終的指令碼提交給 Shell 執行。這並非標準 Shell 的數組操作方式。
運行驗證。
雙擊商務程序名稱,在商務程序編輯頁面單擊工具列的運行表徵圖,運行商務程序,查看引用結果是否正確。您也可以將節點提交至開發環境後,進入開發環境營運中心執行補資料操作,測試回合結果。
DataWorks提供ETL工作流程範本(賦值節點應用)供您快速體驗賦值節點能力,詳情請參見ETL工作流程快速體驗。
注意事項
傳遞層級:賦值節點參數只能傳遞給直接下遊的一層子節點,不支援跨層級的節點傳遞。
傳遞大小限制:傳遞值最大為 2MB。如果指派陳述式的輸出結果超過該限制,賦值節點會運行失敗。
文法限制:
賦值節點代碼中不支援添加註釋,否則可能導致運行結果異常。
ODPS SQL 模式下暫不支援 with 文法。
使用樣本:分語言詳解
不同語言的賦值節點,其輸出結果(outputs)的資料格式和下遊節點的引用方式略有不同。下面以Shell節點為下遊節點,分別舉例說明。
樣本一:傳遞 ODPS SQL 查詢結果
SQL 的查詢結果會作為一個二維數組傳遞給下遊。
上遊節點(賦值節點-ODPS SQL)配置
假設 SQL 代碼如下,查詢返回多行多列的資料:
select * from xc_dpe_e2.xc_rpt_user_info_d where dt='20191008' limit 2;下遊節點(Shell 節點)配置
在 Shell 節點中添加名為
sql_inputs的輸入參數,並引用上遊 SQL 節點的outputs。然後可以使用如下代碼讀取資料:# 直接輸出整個二維數組 echo "整個結果集: ${sql_inputs}"; # 輸出第一行資料(一個一維數組) echo "第一行: ${sql_inputs[0]}"; # 輸出第一行第二個欄位的值 echo "第一行第二個欄位: ${sql_inputs[0][1]}";預期輸出結果
DataWorks 將直接解析參數,並做靜態替換,運行輸出(具體值取決於您的表資料):
整個結果集: value1_1,value1_2 value2_1,value2_2 第一行: value1_1,value1_2 第一行第二個欄位: value1_2
樣本二:傳遞 Python 2 輸出結果
Python 2的 print 語句輸出結果會基於逗號(,)分割,並作為一個一維數組傳遞給下遊。
上遊節點(賦值節點-Python 2)配置
Python 2代碼如下:
print "a,b,c";下遊節點(Shell 節點)配置
在 Shell 節點中添加名為
python_inputs的輸入參數,並引用上遊賦值節點的outputs。然後可以使用如下代碼讀取資料:# 直接輸出整個一維數組 echo "整個結果集: ${python_inputs}"; # 按索引輸出數組中的元素 echo "第一個元素: ${python_inputs[0]}"; echo "第二個元素: ${python_inputs[1]}";預期輸出結果
DataWorks 將直接解析參數,並做靜態替換,運行輸出如下:
整個結果集: "a","b","c" 第一個元素: a 第二個元素: b
樣本三:傳遞 Shell 輸出結果
Shell 的 echo 語句輸出結果會基於逗號(,)分割,並作為一個一維數組傳遞給下遊。
上遊節點(賦值節點-Shell)配置
Shell 代碼如下:
echo "hello,world";下遊節點(Shell 節點)配置
在 Shell 節點中添加名為
Shell_inputs的輸入參數,並引用上遊 Shell 節點的outputs。然後可以使用如下代碼讀取資料:# 直接輸出整個一維數組 echo "整個結果集: ${Shell_inputs}"; # 按索引輸出數組中的元素 echo "第一個元素: ${Shell_inputs[0]}"; echo "第二個元素: ${Shell_inputs[1]}";預期輸出結果
DataWorks 將直接解析參數,並做靜態替換,運行輸出如下:
整個結果集: "hello","world" 第一個元素: hello 第二個元素: world
進階應用程式
與迴圈節點配合使用
當下遊是遍曆節點(for-each)或迴圈節點(do-while)時,賦值節點可以為其提供迴圈的初始值或遍曆列表。詳情請參見for-each節點、do-while節點。
在其他節點類型中使用賦值參數
部分節點(如 EMR Hive、EMR Spark SQL、ODPS Script、Hologres SQL、AnalyticDB for PostgreSQL、Click House SQL 和 MySQL 節點等)自身支援在節點上下文中開啟賦值參數功能,實現與賦值節點相同的效果。