DataWorksは、do-whileノードを提供します。 do-whileノード内のワークフローを再編成し、ノード内でループ実行されるロジックを記述し、終了ノードを構成してループを終了するかどうかを決定できます。 do-whileノードを単独で使用することも、do-whileノードを割り当てノードと共に使用して、割り当てノードによって渡された結果セットをループ処理することもできます。 このトピックでは、do-whileノードの構成とアプリケーションロジックについて説明します。
背景情報
次の表に、do-whileノードの使用上の注意点を示します。
説明 | 参照 |
do-whileノードを使用する前に、ループ回数の制限、do-whileノードのテスト方法、do-whileノードのログを表示する方法など、do-whileノードの制限事項と注意事項を理解しておく必要があります。 | |
ビジネス要件に基づいて、do-whileノードの内部ワークフローを構成できます。 do-whileノードの内部ワークフローを構成する場合は、内部ワークフローが開始ノードで開始し、終了ノードで終了することを確認してください。 | |
do-whileノードは、各ループの関連値を取得するための組み込み変数を備えています。 変数値を取得する例を参考までに示します。 | |
終了ノードを使用して、ループを終了するかどうかを決定できます。 終了ノードのサンプルコードを参考までに示します。 | |
do-whileノードを使用する前に、do-whileノードが使用されるシナリオを理解しておく必要があります。 |
制限
do-whileノードは、DataWorks Standard Edition以降のエディションでのみサポートされています。 詳細については、「DataWorksエディション間の違い」をご参照ください。
do-whileノードの最大ループ回数は 1024 です。
並列実行はサポートされていません。 ループは、前のループが終了した場合にのみ開始できます。
注意事項
ディメンション | 項目 | 説明 |
ループのサポート | ループ回数の制限 | do-whileノードの最大ループ回数は 1024 です。 do-whileノードのループ回数が 1024 を超えると、[終了] ノードは False を返し、ループを終了します。 |
内部ノード | ワークフローオーケストレーション |
|
値の取得 | do-whileノードによって提供される 組み込み変数 を使用して、do-whileノードの祖先ノードとして構成されている割り当てノードによって渡される特定の値を取得できます。 | |
デバッグ | タスクのデバッグ | 標準モードのワークスペースを使用している場合、DataStudioでdo-whileノードを実行するテストを直接実行することはできません。 テストを実行してdo-whileノードの実行結果を確認する場合は、do-whileノードを含むワークフローを開発環境のOperation Centerにコミットしてデプロイし、do-whileノードでタスクを実行する必要があります。 |
ログの表示 | Operation Centerでdo-whileノードの実行ログを表示するには、次の手順を実行します。 do-whileノードを見つけて、ノードの有向非巡回グラフ(DAG)を開きます。 DAGで、ノード名を右クリックし、[内部ノードの表示] を選択します。 | |
依存関係 | 依存関係の設定 | do-whileノードを単独で使用することも、do-whileノードを割り当てノードと共に使用することもできます。 Operation Centerで割り当てノードの出力がdo-whileノードに渡されるかどうかを確認する場合は、データバックフィル機能を使用して、割り当てノードとdo-whileノードの両方のデータをバックフィルできます。 do-whileノードのみを実行する場合、割り当てノードの出力を取得することはできません。 |
do-whileノードの構成とワークフローオーケストレーション
do-whileノードは、内部ノードを含む特殊なノードです。 do-whileノードを作成すると、[開始] ノード、[シェル] ノード(タスクノード)、[終了] ノードという内部ノードが自動的に作成されます。 内部ノードは、ループ用の内部ワークフローに編成されます。 
前の図は、次の情報を示しています。
[開始ノード]
開始ノードはループの開始を示し、ループタスクの処理には使用されません。 do-whileノード内のタスクノードは、開始ノードに依存します。 したがって、開始ノードを削除することはできません。
[シェルノード]
do-whileノードを作成すると、DataWorksは [シェル] という名前の内部シェルタスクノードを自動的に作成します。 デフォルトのシェルノードを削除し、ビジネス要件に基づいてタスクノードを構成できます。
ほとんどの場合、do-whileノードは割り当てノードと共に、または分岐ノードとマージノードと共に使用されます。 do-whileノードのタスクノードをカスタマイズする場合は、do-whileノードの既存の内部ノード間の依存関係を削除し、ビジネス要件に基づいてdo-whileノードの内部ワークフローを構成できます。 do-whileノードの内部ワークフローを構成する場合は、内部ワークフローが [開始] ノードで開始し、[終了] ノードで終了することを確認してください。
[終了ノード]
[終了] ノードは、ループを終了するかどうかを決定します。 終了ノードは、do-whileノードで実行できるループ回数を制御できます。 終了ノードは本質的に割り当てノードです。 終了ノードは、
TrueまたはFalseを返します。 True値は次のループを実行することを示し、False値はループを終了することを示します。ODPS SQL、Shell、または Python 2 を使用して、[終了] ノードのコードを開発できます。 do-whileノードは、終了ノードのコードを開発するための組み込み変数を備えています。 組み込み変数の詳細については、「組み込み変数」および「変数値の例」をご参照ください。 さまざまな言語で開発されたサンプルコードの詳細については、「終了ノードのサンプルコード」をご参照ください。
終了ノードは、タスクノードの子孫ノードである必要があり、削除することはできません。
組み込み変数
ほとんどの場合、do-whileノードによって提供される組み込み変数は、${dag.変数名} 形式で構成されます。 DataWorksのdo-whileノードは、2つの組み込み変数 ${dag.loopTimes} と ${dag.offset} を提供します。 また、do-whileノードを割り当てノードと共に使用して、${dag.変数名} 形式で構成された組み込み変数に基づいて、値割り当てパラメータの値を取得することもできます。
組み込み変数
DataWorksのdo-whileノードによって提供される組み込み変数を使用して、do-whileノードがループに使用されるときに終了したループの数と、現在のループと前のループの間のオフセットを取得できます。
組み込み変数
説明
値
${dag.loopTimes}終了したループの数。
最初のループの場合は 1、2番目のループの場合は 2、3番目のループの場合は 3、...、n番目のループの場合は n。
${dag.offset}現在のループと前のループの間のオフセット。
最初のループの場合は 0、2番目のループの場合は 1、3番目のループの場合は 2、...、n番目のループの場合は n-1。
割り当てノードによって渡された結果セットを取得する
割り当てノード と共にdo-whileノードを使用する場合、次の表に示す組み込み変数を使用して、値割り当てパラメータとループ変数の値を取得できます。
説明do-whileノードが割り当てノードに依存している場合、割り当てノードの [出力パラメータ] で指定された出力パラメータを、do-whileノードの [入力パラメータ] に追加できます。 その後、do-whileノードを使用して、割り当てノードによって渡された結果セットまたは結果セット内の指定されたデータを取得できます。 入力パラメータは、${dag.変数名} 形式で構成されます。 変数名 を、do-whileノードの [入力パラメータ] で指定された入力パラメータの名前に置き換えます。 次の組み込み変数では、
inputはdo-whileノードで定義された [入力パラメータ] の名前を指定し、割り当てノードによって渡された結果セットを取得するために使用されます。 input を、使用する入力パラメータの実際の名前に置き換える必要があります。組み込み変数
説明
${dag.input}祖先割り当てノードによって渡されたデータセット。
${dag.input[${dag.offset}]}現在のループでdo-whileノードによって取得されたデータエントリ。
${dag.input.length}do-whileノード内で取得されたデータセットの長さ。
変数値の例
割り当てノードによって渡される結果セットの形式は、割り当てノードで使用される割り当て言語によって異なります。 割り当てノードによって渡された結果セットを取得するためにdo-whileノードを使用し、割り当てノードがShell言語を使用する場合、結果セットまたは結果セット内の指定されたデータは、1次元配列としてdo-whileノードに渡されます。 割り当てノードによって渡された結果セットを取得するためにdo-whileノードを使用し、割り当てノードがODPS SQL言語を使用する場合、結果セットまたは結果セット内の指定されたデータは、2次元配列としてdo-whileノードに渡されます。 詳細については、「出力パラメータの出力形式」をご参照ください。
例 1:Shellノードを割り当てノードとして使用する
割り当てノードの出力
Shellノードを割り当てノードとして使用し、割り当てノードの最後の出力は
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01です。do-whileノードの変数の値
組み込み変数
最初のループの値
2番目のループの値
${dag.input}2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01${dag.input[${dag.offset}]}2021-03-282021-03-29${dag.input.length}5
${dag.loopTimes}1
2
${dag.offset}0
1
例 2:ODPS SQLノードを割り当てノードとして使用する
割り当てノードの出力
ODPS SQLノードを割り当てノードとして使用し、最後のSELECTステートメントは次の2つのデータを返します。
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30 to 40 years old | Cancer | | 0016359814159 | Unknown | 30 to 40 years old | Cancer | +----------------------------------------------+do-whileノードの変数の値
組み込み変数
最初のループの値
2番目のループの値
${dag.input}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30 to 40 years old | Cancer | | 0016359814159 | Unknown | 30 to 40 years old | Cancer | +----------------------------------------------+${dag.input[${dag.offset}]}0016359810821, Hubei Province, 30 to 40 years old, Cancer0016359814159, Unknown, 30 to 40 years old, Cancer${dag.input.length}2
説明2次元配列の行数は、データセットの長さです。 割り当てノードの出力の2次元配列の行数は 2 です。
${dag.input[0][1]}説明この組み込み変数は、2次元配列の1行目と2列目の値を指定します。
湖北省
${dag.loopTimes}1
2
${dag.offset}0
1
終了ノードのサンプルコード
ODPS SQL、Shell、または Python 2 を使用して、[終了] ノードのコードを開発できます。 このセクションでは、これらの言語での典型的なサンプルコードを提供します。
ODPS SQL
SELECT CASE
WHEN COUNT(1) > 0 AND ${dag.offset}<= 9
THEN true
ELSE false
END
FROM xc_dpe_e2.xc_rpt_user_info_d where dt='20200101';
// 終了ノードのこのサンプルコードでは、行数とオフセットを固定値と比較して、do-whileノードで実行できるループ回数を制限しています。
上記の終了ノードのサンプルコードでは、行数とオフセットを固定値と比較して、do-whileノードで実行できるループ回数を制限しています。
Shell
if [ ${dag.loopTimes} -lt 5 ];
then
echo "True"
else
echo "False"
fi
// このコードでは、終了したループの数を 5 と比較して、do-whileノードで実行できるループ回数を制限しています。 ${dag.loopTimes} 変数は、終了したループの数を指定します。
// ${dag.loopTimes} 変数の値は、最初のループでは 1 で、ループごとに 1 ずつ増加します。 この場合、${dag.loopTimes} 変数の値は、2番目のループでは 2、5番目のループでは 5 になります。 上記のサンプルコードでは、5番目のループが終了すると、終了ノードの出力は False になり、do-whileノードはループを終了します。
上記のコードでは、終了したループの数を 5 と比較して、do-whileノードで実行できるループ回数を制限しています。 ${dag.loopTimes} 変数は、終了したループの数を指定します。
${dag.loopTimes} 変数の値は、最初のループでは 1 で、ループごとに 1 ずつ増加します。 この場合、${dag.loopTimes} 変数の値は、2番目のループでは 2、5番目のループでは 5 になります。 上記のサンプルコードでは、5番目のループが終了すると、終了ノードの出力は False になり、do-whileノードはループを終了します。
Python 2
if ${dag.loopTimes}<${dag.input.length}:
print True;
else
print False;
# 終了ノードが True を返すと、次のループが開始されます。
# 終了ノードが False を返すと、ループが終了します。
上記のサンプルコードでは、終了したループの数を割り当てノードによって渡されたデータセットの行数と比較して、do-whileノードで実行できるループ回数を制限しています。 ${dag.loopTimes} 変数は、終了したループの数を指定します。
シナリオ
割り当てノードと共にdo-whileノードを使用する
次の表に、割り当てノード と共にdo-whileノードを使用する場合の典型的なシナリオと注意事項を示します。
シナリオ | 注意事項 | 構成例 |
|
|
|
分岐ノードとマージノードと共にdo-whileノードを使用する
次の表に、分岐ノード および マージノード と共にdo-whileノードを使用する場合の典型的なシナリオと注意事項を示します。
シナリオ | 注意事項 |
do-whileノードの内部ノードは、論理判断または結果のトラバーサルを実行する必要があります。 この場合、do-whileノード内のタスクノードをカスタマイズし、分岐ノードとマージノードをdo-whileノードと共に使用できます。 たとえば、 | do-whileノードの内部ワークフローでは、分岐ノード |
