do-while節(jié)點(diǎn)最佳實(shí)踐
本文為您介紹通過循環(huán)的方式依次處理一組數(shù)據(jù)的每一行的復(fù)雜場(chǎng)景。
前提條件
請(qǐng)?jiān)诓僮髑埃攘私鈊o-while節(jié)點(diǎn)邏輯,詳情請(qǐng)參見do-while節(jié)點(diǎn)邏輯原理介紹。
背景信息
循環(huán)節(jié)點(diǎn)循環(huán)輸出賦值節(jié)點(diǎn)結(jié)果集。
需要部署一個(gè)上游節(jié)點(diǎn),能夠把查詢出的數(shù)據(jù)輸出給下游節(jié)點(diǎn)使用,您可以使用賦值節(jié)點(diǎn)實(shí)現(xiàn)該條件。
循環(huán)節(jié)點(diǎn)需要能夠獲取上游賦值節(jié)點(diǎn)的輸出,您可以通過配置上下文依賴來實(shí)現(xiàn)該條件。
循環(huán)節(jié)點(diǎn)的內(nèi)部節(jié)點(diǎn)需要能夠引用到每一行的數(shù)據(jù),增強(qiáng)已有的節(jié)點(diǎn)上下文,并額外下發(fā)了系統(tǒng)變量${dag.offset},可以幫您快速引用循環(huán)節(jié)點(diǎn)的上下文。
以下以一個(gè)具體的案例,為您示例復(fù)雜場(chǎng)景的配置步驟。 如上圖所示:
賦值節(jié)點(diǎn)輸出一個(gè)二維數(shù)組,將此二維數(shù)組傳遞給do-while循環(huán)節(jié)點(diǎn)。
二維數(shù)組的示例值為:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | 湖北省 | 30~40歲 | 巨蟹座 | | 0016359814159 | 未知 | 30~40歲 | 巨蟹座 | +----------------------------------------------+
do-while節(jié)點(diǎn)的內(nèi)部節(jié)點(diǎn)通過變量來獲取并打印當(dāng)前循環(huán)參數(shù)、偏移量、上游賦值節(jié)點(diǎn)輸入的參數(shù)值等。
配置流程
配置節(jié)點(diǎn)依賴
do-while節(jié)點(diǎn)需要依賴賦值節(jié)點(diǎn)。
賦值結(jié)果集
賦值節(jié)點(diǎn)自帶的節(jié)點(diǎn)上下文輸出參數(shù)outputs,需作為do-while循環(huán)節(jié)點(diǎn)的節(jié)點(diǎn)上下文輸入?yún)?shù)。
do-while循環(huán)節(jié)點(diǎn)的內(nèi)部節(jié)點(diǎn)獲取參數(shù)
根據(jù)業(yè)務(wù)需求自定義do-while循環(huán)節(jié)點(diǎn)的內(nèi)部業(yè)務(wù)流程,并在內(nèi)部流程的節(jié)點(diǎn)中通過變量來獲取所需參數(shù)值。
創(chuàng)建并配置賦值節(jié)點(diǎn)
核心操作要點(diǎn)為:
賦值代碼與上下文參數(shù):選擇賦值節(jié)點(diǎn)的賦值語言,并通過命令定義好賦值節(jié)點(diǎn)最終輸出的結(jié)果集,賦值節(jié)點(diǎn)會(huì)將本節(jié)點(diǎn)最后一條輸出語句賦值給賦值節(jié)點(diǎn)自帶的outputs輸出參數(shù)。
說明賦值節(jié)點(diǎn)的輸出后續(xù)需要作為do-while節(jié)點(diǎn)本節(jié)點(diǎn)輸入。以下代碼僅為測(cè)試使用,您無法直接訪問圖上代碼中使用的表,您可在了解循環(huán)節(jié)點(diǎn)基本使用后,將代碼中的表替換為您空間下已有的表。
上下游依賴關(guān)系:您可以在業(yè)務(wù)流程中新建一個(gè)賦值節(jié)點(diǎn),并通過連線,配置賦值節(jié)點(diǎn)為do-while節(jié)點(diǎn)的上游節(jié)點(diǎn)。
詳細(xì)操作步驟請(qǐng)參見賦值節(jié)點(diǎn)。
do-while節(jié)點(diǎn)獲取結(jié)果集
單擊do-while節(jié)點(diǎn)編輯頁面右側(cè)的調(diào)度配置,在do-while節(jié)點(diǎn)的節(jié)點(diǎn)上下文區(qū)域,單擊添加。設(shè)置參數(shù)名為input,取值來源為上游賦值節(jié)點(diǎn)的輸出。
這里的上下文關(guān)系為賦值節(jié)點(diǎn)與do-while節(jié)點(diǎn)的上下文參數(shù)配置,不是內(nèi)部節(jié)點(diǎn)的上下文參數(shù)配置。
定義循環(huán)體
雙擊do-while節(jié)點(diǎn)名稱,打開節(jié)點(diǎn)的編輯頁面,定義循環(huán)體。
do-while節(jié)點(diǎn)默認(rèn)有start、shell和end三個(gè)節(jié)點(diǎn),通過編譯Shell節(jié)點(diǎn)的代碼,打印循環(huán)參數(shù)。操作核心要點(diǎn)如下。
上下游依賴:通過連線將內(nèi)部節(jié)點(diǎn)的上下游關(guān)系建立好。
循環(huán)任務(wù)代碼:內(nèi)部的Shell節(jié)點(diǎn)的代碼編譯時(shí),可以聯(lián)合內(nèi)置變量來打印各種循環(huán)參數(shù)。do-while節(jié)點(diǎn)可用的內(nèi)置變量可參見內(nèi)置變量,Shell節(jié)點(diǎn)的參考代碼如下。
echo '${dag.input}'; echo '獲取當(dāng)前循環(huán)的行數(shù)據(jù):'${dag.input[${dag.offset}]}; echo '獲取偏移量:'${dag.offset}; echo '獲取循環(huán)次數(shù):'${dag.loopTimes}; echo '獲取上游賦值節(jié)點(diǎn)_odpssql傳遞的數(shù)據(jù)集長(zhǎng)度:'${dag.input.length}; echo '如果您要取賦值節(jié)點(diǎn)傳遞的數(shù)據(jù)集中某行某列數(shù)據(jù),需要按照二維數(shù)組方式取值:'${dag.input[0][1]};
定義end節(jié)點(diǎn)的循環(huán)結(jié)束條件
可使用do-while節(jié)點(diǎn)支持的內(nèi)置變量來進(jìn)行循環(huán)控制。例如,比較變量dag.loopTimes(循環(huán)次數(shù))和dag.input.length(取值長(zhǎng)度)。如果dag.loopTimes小于dag.input.length,輸出True并繼續(xù)循環(huán)。如果不小于,則輸出False并退出循環(huán)。樣例代碼如下。
if ${dag.loopTimes}<${dag.input.length}:
print True;
else:
print False;
運(yùn)行節(jié)點(diǎn)并查看結(jié)果
進(jìn)入運(yùn)維中心后,右鍵節(jié)點(diǎn)選擇
,選擇賦值節(jié)點(diǎn)和循環(huán)節(jié)點(diǎn),運(yùn)行完成后在運(yùn)行日志中查看運(yùn)行結(jié)果。如果您在do-while節(jié)點(diǎn)內(nèi)使用了賦值節(jié)點(diǎn)傳遞的值,請(qǐng)?jiān)谶\(yùn)維中心測(cè)試時(shí),同時(shí)運(yùn)行賦值節(jié)點(diǎn)和循環(huán)節(jié)點(diǎn)。
在運(yùn)維中心查看do-while節(jié)點(diǎn)的執(zhí)行日志時(shí),您需要右鍵實(shí)例,單擊查看內(nèi)部節(jié)點(diǎn)來查看內(nèi)部節(jié)點(diǎn)的執(zhí)行日志。
賦值節(jié)點(diǎn)的輸出結(jié)果。
第1次end節(jié)點(diǎn)的運(yùn)行結(jié)果。
第2次end節(jié)點(diǎn)的運(yùn)行結(jié)果。