賦值節(jié)點(diǎn)
當(dāng)您需要將上游節(jié)點(diǎn)任務(wù)的查詢或輸出結(jié)果提供給下游節(jié)點(diǎn)使用時(shí),可通過(guò)賦值節(jié)點(diǎn)實(shí)現(xiàn)。賦值節(jié)點(diǎn)支持ODPS SQL、SHELL和Python三種賦值語(yǔ)言,將節(jié)點(diǎn)最后一條查詢或輸出結(jié)果自動(dòng)賦值給節(jié)點(diǎn)自帶的輸出參數(shù)(outputs),便于賦值節(jié)點(diǎn)的下游節(jié)點(diǎn)引用。您可結(jié)合節(jié)點(diǎn)上下文配置,參考本文使用賦值節(jié)點(diǎn)。
注意事項(xiàng)
賦值節(jié)點(diǎn)功能說(shuō)明
賦值節(jié)點(diǎn)參數(shù)傳遞只支持傳遞給一層子節(jié)點(diǎn),不支持跨節(jié)點(diǎn)傳遞。
賦值節(jié)點(diǎn)只能將最后一條查詢或輸出結(jié)果通過(guò)自帶輸出參數(shù)傳遞給下游。
賦值節(jié)點(diǎn)的Python賦值語(yǔ)言使用的Python版本為Python 2.0。
賦值節(jié)點(diǎn)代碼中不支持添加注釋,添加注釋可能導(dǎo)致運(yùn)行結(jié)果有誤。
賦值節(jié)點(diǎn)版本及賦值參數(shù)說(shuō)明
部分節(jié)點(diǎn)可通過(guò)節(jié)點(diǎn)上下文中的賦值參數(shù),達(dá)到與賦值節(jié)點(diǎn)相同的目的(例如,EMR Hive、EMR Spark SQL、ODPS Script、Hologres SQL、AnalyticDB for PostgreSQL和MySQL節(jié)點(diǎn)),賦值參數(shù)的使用與賦值節(jié)點(diǎn)一致,添加賦值參數(shù)的操作,詳情請(qǐng)參見配置節(jié)點(diǎn)上下文。
僅標(biāo)準(zhǔn)版及以上版本的DataWorks,才可使用賦值節(jié)點(diǎn),以及在上述節(jié)點(diǎn)中使用賦值參數(shù)功能。購(gòu)買DataWorks,請(qǐng)參見購(gòu)買指引。
為避免下游節(jié)點(diǎn)無(wú)法獲取賦值節(jié)點(diǎn)的結(jié)果集,賦值節(jié)點(diǎn)及其下游節(jié)點(diǎn)配置完成后,請(qǐng)統(tǒng)一運(yùn)行節(jié)點(diǎn)所在的業(yè)務(wù)流程。
調(diào)試運(yùn)行任務(wù),請(qǐng)參見調(diào)試運(yùn)行任務(wù)。
下游節(jié)點(diǎn)引用賦值節(jié)點(diǎn)結(jié)果集后,您可提交下游節(jié)點(diǎn)及賦值節(jié)點(diǎn)至開發(fā)環(huán)境運(yùn)維中心,測(cè)試引用結(jié)果是否正確。詳情請(qǐng)參見測(cè)試賦值節(jié)點(diǎn)結(jié)果集。
說(shuō)明依賴賦值節(jié)點(diǎn)的下游節(jié)點(diǎn)均可獲取賦值節(jié)點(diǎn)的查詢結(jié)果(即結(jié)果集),無(wú)節(jié)點(diǎn)類型限制。本文主要以O(shè)DPS SQL 節(jié)點(diǎn)、以及Shell節(jié)點(diǎn)為例,為您介紹下游節(jié)點(diǎn)如何獲取賦值節(jié)點(diǎn)的輸出結(jié)果。
本實(shí)驗(yàn)中的,您可通過(guò)ETL工作流模板快速體驗(yàn)本案例賦值節(jié)點(diǎn)參數(shù)的傳遞能力。
僅空間管理員角色可導(dǎo)入ETL模板至目標(biāo)工作空間,為賬號(hào)授權(quán)空間管理員角色詳情請(qǐng)參見空間級(jí)模塊權(quán)限管控。
導(dǎo)入ETL工作流模板,詳情請(qǐng)參見ETL工作流快速體驗(yàn)。
ETL工作流模板快捷入口,請(qǐng)點(diǎn)擊賦值節(jié)點(diǎn)應(yīng)用。
原理介紹
在DataWorks中,節(jié)點(diǎn)上下文參數(shù)可實(shí)現(xiàn)節(jié)點(diǎn)參數(shù)的上下游傳遞,賦值節(jié)點(diǎn)在此基礎(chǔ)上,可將賦值節(jié)點(diǎn)最后一條查詢結(jié)果傳遞給自帶的輸出參數(shù)(outputs),若下游節(jié)點(diǎn)依賴了賦值節(jié)點(diǎn),則下游節(jié)點(diǎn)可通過(guò)添加輸入?yún)?shù)的方式,在節(jié)點(diǎn)代碼中獲取賦值節(jié)點(diǎn)輸出參數(shù)(outputs)的結(jié)果集(即上游賦值節(jié)點(diǎn)的查詢結(jié)果)。
賦值節(jié)點(diǎn)自帶的輸出參數(shù)(outputs)不可修改,outputs取值由賦值節(jié)點(diǎn)最后一條查詢或輸出結(jié)果決定。
賦值節(jié)點(diǎn)下游獲取賦值節(jié)點(diǎn)結(jié)果集(outputs)時(shí),需要先直接依賴賦值節(jié)點(diǎn)(即賦值節(jié)點(diǎn)為下游節(jié)點(diǎn)的一層父節(jié)點(diǎn)),并在節(jié)點(diǎn)輸入?yún)?shù)處添加賦值節(jié)點(diǎn)結(jié)果集。您可自定義賦值節(jié)點(diǎn)結(jié)果集在下游節(jié)點(diǎn)的參數(shù)名稱,例如上圖中命名為sql_inputs。
不同賦值語(yǔ)言的賦值節(jié)點(diǎn),其結(jié)果集格式存在差異。賦值節(jié)點(diǎn)下游獲取賦值節(jié)點(diǎn)結(jié)果集outputs時(shí),需要根據(jù)outputs具體情況,以${參數(shù)名}的格式,使用一維數(shù)組或二維數(shù)組的方式在代碼中獲取賦值節(jié)點(diǎn)傳遞的結(jié)果集、或結(jié)果集中的指定數(shù)據(jù)。
賦值節(jié)點(diǎn)使用流程
配置賦值節(jié)點(diǎn):定義outputs結(jié)果集。此階段您需要選擇賦值語(yǔ)言,以及確定最后一條查詢或輸出結(jié)果。
配置上下游依賴:獲取賦值節(jié)點(diǎn)結(jié)果集的下游節(jié)點(diǎn)需提前依賴該賦值節(jié)點(diǎn)。
下游引用賦值節(jié)點(diǎn)結(jié)果集:下游節(jié)點(diǎn)可通過(guò)
方式獲取賦值節(jié)點(diǎn)結(jié)果集,并通過(guò)${參數(shù)名}的方式在代碼中獲取賦值節(jié)點(diǎn)結(jié)果集。若要獲取結(jié)果集中的指定數(shù)據(jù),您需根據(jù)賦值節(jié)點(diǎn)的賦值語(yǔ)言,通過(guò)一維數(shù)組或二維數(shù)組的方式獲取。調(diào)試運(yùn)行任務(wù):您可運(yùn)行業(yè)務(wù)流程,查看引用結(jié)果是否符合預(yù)期。
測(cè)試獲取的賦值節(jié)點(diǎn)結(jié)果集:下游節(jié)點(diǎn)引用賦值節(jié)點(diǎn)結(jié)果集后,您可提交下游節(jié)點(diǎn)及賦值節(jié)點(diǎn)至開發(fā)環(huán)境運(yùn)維中心測(cè)試引用結(jié)果是否正確。
賦值節(jié)點(diǎn)創(chuàng)建入口
進(jìn)入數(shù)據(jù)開發(fā)頁(yè)面。
登錄DataWorks控制臺(tái),切換至目標(biāo)地域后,單擊左側(cè)導(dǎo)航欄的 ,在下拉框中選擇對(duì)應(yīng)工作空間后單擊進(jìn)入數(shù)據(jù)開發(fā)。
進(jìn)入節(jié)點(diǎn)創(chuàng)建入口。
在數(shù)據(jù)開發(fā)頁(yè)面基于具體業(yè)務(wù)流程創(chuàng)建節(jié)點(diǎn),并根據(jù)界面指引配置節(jié)點(diǎn)的名稱、路徑等基本信息。創(chuàng)建入口如下圖。
本示例中新建3個(gè)不同語(yǔ)言的賦值節(jié)點(diǎn)(Python、ODPS SQL和SHELL),節(jié)點(diǎn)名稱分別為fuzhi_python、fuzhi_sql、fuzhi_shell。
使用賦值節(jié)點(diǎn)時(shí),不同賦值語(yǔ)言,其賦值參數(shù)(outputs)輸出格式存在差異,詳情請(qǐng)參見賦值節(jié)點(diǎn)輸出格式。
此外,您可根據(jù)實(shí)際需要配置各節(jié)點(diǎn)調(diào)度配置中的基礎(chǔ)屬性、時(shí)間屬性、資源屬性,詳情可參見配置基礎(chǔ)屬性、時(shí)間屬性配置說(shuō)明、配置資源屬性。
賦值節(jié)點(diǎn)輸出格式
賦值節(jié)點(diǎn)支持ODPS SQL、SHELL和Python三種賦值語(yǔ)言,使用不同賦值語(yǔ)言時(shí),賦值節(jié)點(diǎn)的參數(shù)(outputs)輸出格式不同,下游節(jié)點(diǎn)需要根據(jù)outputs的具體情況,以${參數(shù)名}的格式,使用一維數(shù)組或二維數(shù)組的方式在代碼中獲取賦值節(jié)點(diǎn)傳遞的結(jié)果集、或結(jié)果集中的指定數(shù)據(jù)。
賦值語(yǔ)言 | outputs參數(shù)取值 | outputs參數(shù)格式 | outputs參數(shù)大小限制 |
ODPS SQL | 最后一行SELECT語(yǔ)句的輸出作為賦值參數(shù),添加為賦值節(jié)點(diǎn)的本節(jié)點(diǎn)輸出參數(shù),供其他節(jié)點(diǎn)引用。 | 將輸出結(jié)果作為一個(gè)二維數(shù)組傳遞至下游。 | 傳遞值最大為2MB。如果賦值語(yǔ)句的輸出結(jié)果超過(guò)該限制,賦值節(jié)點(diǎn)會(huì)運(yùn)行失敗。 |
SHELL | 最后一行ECHO語(yǔ)句的數(shù)據(jù),添加為賦值節(jié)點(diǎn)的本節(jié)點(diǎn)輸出參數(shù),供其他節(jié)點(diǎn)引用。 | 將輸出結(jié)果基于逗號(hào)(,)分割為一維數(shù)組。 | |
Python | 最后一行PRINT語(yǔ)句的輸出,添加為賦值節(jié)點(diǎn)的本節(jié)點(diǎn)輸出參數(shù),供其他節(jié)點(diǎn)引用。 | 將輸出結(jié)果基于逗號(hào)(,)分割為一維數(shù)組。 |
下游獲取賦值節(jié)點(diǎn)結(jié)果集:應(yīng)用示例一
本示例中,直接通過(guò)拉線,將start節(jié)點(diǎn)作為所有賦值節(jié)點(diǎn)的上游節(jié)點(diǎn),down_compare節(jié)點(diǎn)作為所有賦值節(jié)點(diǎn)的下游節(jié)點(diǎn),其中down_compare節(jié)點(diǎn)為Shell節(jié)點(diǎn),以${參數(shù)名}的格式,使用一維數(shù)組或二維數(shù)組的方式,通過(guò)Shell節(jié)點(diǎn)分別輸出上游賦值語(yǔ)言分別為ODPS SQL(fuzhi_sql)、Python(fuzhi_python)、SHELL(fuzhi_shell)的結(jié)果集與結(jié)果集中的指定數(shù)據(jù)。
賦值節(jié)點(diǎn)(fuzhi_python、fuzhi_sql、fuzhi_shell):自帶輸出參數(shù)outputs。
下游節(jié)點(diǎn)(down_compare):下游節(jié)點(diǎn)設(shè)置賦值節(jié)點(diǎn)依賴關(guān)系后,將待引用的賦值參數(shù)添加為
,參數(shù)名可自定義。
具體過(guò)程請(qǐng)參照下文。
ODPS SQL賦值語(yǔ)言
以下以配置賦值語(yǔ)言為ODPS_SQL的賦值節(jié)點(diǎn),并在down_compare節(jié)點(diǎn)中引用賦值參數(shù)為例,為您示意如何操作。
配置上游賦值節(jié)點(diǎn)。
在相應(yīng)的業(yè)務(wù)流程下,雙擊打開賦值語(yǔ)言為ODPS SQL的賦值節(jié)點(diǎn)fuzhi_sql。
在代碼編輯頁(yè)面,選擇賦值語(yǔ)言為ODPS_SQL,寫入賦值代碼。
示例如下。
select * from xc_dpe_e2.xc_rpt_user_info_d where dt='20191008' limit 10;
單擊頁(yè)面右側(cè)的調(diào)度配置,查看節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸出參數(shù)。
賦值節(jié)點(diǎn)將代碼的查詢結(jié)果作為節(jié)點(diǎn)輸出,賦值給賦值節(jié)點(diǎn)自帶的輸出參數(shù)outputs。
本示例賦值節(jié)點(diǎn)的查詢結(jié)果如下。則此查詢結(jié)果作為一個(gè)二維數(shù)組,賦值給本節(jié)點(diǎn)輸出參數(shù)中的outputs參數(shù)。
配置下游節(jié)點(diǎn)。
雙擊打開下游Shell節(jié)點(diǎn)down_compare。
在代碼開發(fā)頁(yè)面編寫代碼。
示例如下。
echo '${sql_inputs}'; echo '取上游sql節(jié)點(diǎn)輸出第1行數(shù)據(jù)'${sql_inputs[0]}; echo '取上游sql節(jié)點(diǎn)輸出第2行數(shù)據(jù)'${sql_inputs[1]}; echo '取上游sql節(jié)點(diǎn)輸出第1行第2個(gè)字段'${sql_inputs[0][1]}; echo '取上游sql節(jié)點(diǎn)輸出第2行第3個(gè)字段'${sql_inputs[1][2]};
單擊頁(yè)面右側(cè)的調(diào)度配置,配置節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸入?yún)?shù)。
將fuzhi_sql節(jié)點(diǎn)的outputs參數(shù)添加為本節(jié)點(diǎn)輸入?yún)?shù),并命名為sql_inputs。
示例返回的引用結(jié)果如下。
Python賦值語(yǔ)言
以下以配置賦值語(yǔ)言為Python的賦值節(jié)點(diǎn),并在down_compare節(jié)點(diǎn)中引用賦值參數(shù)為例,為您示意如何操作。
配置上游賦值節(jié)點(diǎn)。
在相應(yīng)的業(yè)務(wù)流程下,雙擊打開賦值語(yǔ)言為Python的上游節(jié)點(diǎn)fuzhi_python。
在代碼編輯頁(yè)面,選擇賦值語(yǔ)言為Python,寫入賦值代碼。
例如:
print "a,b,c";
單擊頁(yè)面右側(cè)的調(diào)度配置,查看節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸出參數(shù)。
賦值節(jié)點(diǎn)將代碼的查詢結(jié)果作為節(jié)點(diǎn)輸出,賦值給賦值節(jié)點(diǎn)自帶的輸出參數(shù)outputs。本示例的查詢結(jié)果為a,b,c。
賦值語(yǔ)言為Python時(shí),查詢結(jié)果將基于逗號(hào)(,)分割為一維數(shù)組,賦值給本節(jié)點(diǎn)輸出參數(shù)中的outputs參數(shù)。
配置下游節(jié)點(diǎn)。
雙擊打開下游Shell節(jié)點(diǎn)down_compare。
在代碼開發(fā)頁(yè)面編寫代碼。
例如:
echo '這是上游python節(jié)點(diǎn)的輸出'${python_inputs}; echo '取上游python節(jié)點(diǎn)輸出的第1個(gè)數(shù)據(jù)'${python_inputs[0]}; echo '取上游python節(jié)點(diǎn)輸出的第2個(gè)數(shù)據(jù)'${python_inputs[1]};
單擊頁(yè)面右側(cè)的調(diào)度配置,配置節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸入?yún)?shù)。
將fuzhi_python節(jié)點(diǎn)的outputs參數(shù)添加為本節(jié)點(diǎn)輸入?yún)?shù),并命名為python_inputs。
示例返回的引用結(jié)果如下。
SHELL賦值語(yǔ)言
以下以配置賦值語(yǔ)言為SHELL的賦值節(jié)點(diǎn),并在down_compare節(jié)點(diǎn)中引用賦值參數(shù)為例,為您示意如何操作。
配置上游賦值節(jié)點(diǎn)。
在相應(yīng)的業(yè)務(wù)流程下,雙擊打開賦值語(yǔ)言為SHELL的上游節(jié)點(diǎn)fuzhi_shell。
在代碼編輯頁(yè)面,選擇賦值語(yǔ)言為SHELL,寫入賦值代碼。
例如:
echo "hello,world";
單擊頁(yè)面右側(cè)的調(diào)度配置,查看節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸出參數(shù)。
賦值節(jié)點(diǎn)將代碼的查詢結(jié)果作為節(jié)點(diǎn)輸出,賦值給賦值節(jié)點(diǎn)自帶的輸出參數(shù)outputs。本示例的查詢結(jié)果為hello,world。
賦值語(yǔ)言為SHELL時(shí),查詢結(jié)果將基于逗號(hào)(,)分割為一維數(shù)組,賦值給本節(jié)點(diǎn)輸出參數(shù)中的outputs參數(shù)。
配置下游節(jié)點(diǎn)。
雙擊打開下游Shell節(jié)點(diǎn)down_compare。
在代碼開發(fā)頁(yè)面編寫代碼。
例如:
echo '這是上游shell節(jié)點(diǎn)的輸出'${shell_inputs}; echo '取上游shell節(jié)點(diǎn)輸出的第1個(gè)數(shù)據(jù)'${shell_inputs[0]}; echo '取上游shell節(jié)點(diǎn)輸出的第2個(gè)數(shù)據(jù)'${shell_inputs[1]};
單擊頁(yè)面右側(cè)的調(diào)度配置,配置節(jié)點(diǎn)上下文中的本節(jié)點(diǎn)輸入?yún)?shù)。
將fuzhi_shell節(jié)點(diǎn)的outputs參數(shù)添加為本節(jié)點(diǎn)輸入?yún)?shù),并命名為shell_inputs。
示例返回的引用結(jié)果如下。
下游獲取賦值節(jié)點(diǎn)結(jié)果集:應(yīng)用示例二
不同語(yǔ)言的賦值參數(shù)(output)使用示例如下。
賦值語(yǔ)言 | outputs取值示例 | 賦值節(jié)點(diǎn)調(diào)度配置 | 下游節(jié)點(diǎn)調(diào)度配置 | 下游節(jié)點(diǎn)取值方式 | 下游節(jié)點(diǎn)返回結(jié)果 |
ODPS SQL | 示例查看fuzhi_tb表。
|
配置節(jié)點(diǎn)上下文,詳情請(qǐng)參見配置節(jié)點(diǎn)上下文。 | 以上游賦值節(jié)點(diǎn)使用的賦值語(yǔ)言為ODPS SQL示例。
| 不同類型的下游節(jié)點(diǎn)取值如下:
| Hello |
SHELL | 示例語(yǔ)句為: | Data | |||
Python | 示例語(yǔ)句為: | Works! |
調(diào)試運(yùn)行任務(wù)
下游獲取賦值節(jié)點(diǎn)結(jié)果集后,您可雙擊業(yè)務(wù)流程名稱,在業(yè)務(wù)流程編輯頁(yè)面單擊工具欄的圖標(biāo),運(yùn)行業(yè)務(wù)流程,查看引用結(jié)果是否正確。
若賦值節(jié)點(diǎn)的下游是遍歷節(jié)點(diǎn)(for-each節(jié)點(diǎn))或循環(huán)節(jié)點(diǎn)(do-while節(jié)點(diǎn)),則您需前往運(yùn)維中心執(zhí)行相應(yīng)任務(wù),查看引用結(jié)果。
賦值節(jié)點(diǎn)結(jié)合遍歷節(jié)點(diǎn)或循環(huán)節(jié)點(diǎn)使用的最佳實(shí)踐,請(qǐng)參見配置使用for-each節(jié)點(diǎn)、配置使用do-while節(jié)點(diǎn)。
測(cè)試獲取的賦值節(jié)點(diǎn)結(jié)果集
下游節(jié)點(diǎn)引用賦值節(jié)點(diǎn)結(jié)果集后,您可將下游節(jié)點(diǎn)及賦值節(jié)點(diǎn)提交至開發(fā)環(huán)境,并進(jìn)入開發(fā)環(huán)境運(yùn)維中心執(zhí)行補(bǔ)數(shù)據(jù)操作,測(cè)試下游節(jié)點(diǎn)獲取的賦值節(jié)點(diǎn)結(jié)果集數(shù)據(jù)是否正確。