DataWorks は、一連のタスクをループで実行するための do-while ノードを提供します。do-while ノード内でビジネスロジックをオーケストレーションし、その内部の終了ノードを使用して終了条件を定義できます。do-while ノードは、単独で使用することも、割り当てノードと組み合わせて、割り当てノードから渡されたデータセットを反復処理することもできます。このトピックでは、do-while ノードのコンポーネントと適用ロジックについて説明します。
背景情報
次の表は、このトピックの概要を示しています。
説明 | リファレンス |
最大ループ回数、テスト方法、ログ表示など、do-while ノードの制限と注意事項。 | |
内部ワークフローのカスタマイズ。組み込みの開始ノードで始まり、組み込みの終了ノードで終わる必要があります。 | |
組み込み変数を使用してループパラメーターを取得する方法と、値の取得例。 | |
終了ノードがループの終了を制御する方法とコードサンプル。 | |
do-while ノードの典型的なユースケースの確認。 |
制限事項
do-while ノードは、DataWorks Standard Edition 以降でのみ利用できます。詳細については、「DataWorks のエディションと機能」をご参照ください。
do-while ノードの最大ループ回数は 1,024 回です。
並列実行はサポートされていません。新しいループは、前のループが完了した後にのみ開始できます。
注意事項
ディメンション | 項目 | 説明 |
ループサポート | 最大ループ回数 | do-while ノードの最大ループ回数は 1,024 回です。終了ノードによって制御されるループ回数が 1,024 を超えると、ノードはエラーを報告します。 |
内部ノード | ワークフローオーケストレーション |
|
値の取得 | ノードには、上流の割り当てノードから指定された値を取得するための組み込み変数が用意されています。 | |
デバッグ | タスクのデバッグ | 標準モードのワークスペースでは、DataStudio で do-while ノードを直接テストすることはできません。 代わりに、ノードを含むタスクを開発環境にコミットし、オペレーションセンターで実行する必要があります。 |
ログの表示 | オペレーションセンターで do-while ノードの実行ログを表示するには、インスタンスを右クリックし、View Inner Nodes を選択します。 | |
依存関係 | 依存関係の設定 | do-while ノードは単独で使用することも、割り当てノードと組み合わせて使用することもできます。ただし、オペレーションセンターでデータバックフィルを実行する場合は、両方のノードを選択して実行する必要があります。do-while ノードのみを実行すると、割り当てノードから値を受け取ることができません。 |
コンポーネントとワークフローオーケストレーション
do-while ノードは、内部ワークフローを保持する特殊なコンテナーノードです。do-while ノードを作成すると、開始ノード (ループ開始)、シェルノード (ループタスク)、終了ノード (ループ終了条件) の 3 つの内部ノードが自動的に作成されます。これらの内部ノードは、ループタスクを実行するためのワークフローに編成されます。
開始ノード
ループの開始を示します。タスクコードは含まれず、削除することもできません。ループ内の他のすべてのノードは、直接的または間接的に開始ノードに依存する必要があります。
ループのロジック
デフォルトでは、DataWorks はループタスク用に内部シェルノードを作成します。デフォルトのシェルノードを削除し、ループ内にカスタムのビジネスワークフローを構築できます。
通常、ループワークフローは、割り当てノード、ブランチノード、またはマージノードとともに使用されます。ループタスクをカスタマイズする際、内部ノード間の依存関係を削除してワークフローを再配置できます。ただし、ワークフローは開始ノードで始まり、終了ノード で終わる必要があります。
終了ノード
終了ノードは、do-while ノードのループ条件を定義します。割り当てノードのように機能し、次のループを続行するために
trueを出力するか、ループを終了するためにfalseを出力します。終了ノードのループ条件コードは、ODPS SQL、Shell、または Python 2 を使用して記述できます。do-while ノードには、このコードを簡素化するための組み込み変数が用意されています。組み込み変数の詳細については、「組み込み変数」および「値の取得例」をご参照ください。さまざまな言語のコードサンプルについては、「サンプルコード:終了ノードを使用したループの終了」をご参照ください。
ループ内のすべてのノードは、終了ノードの上流にある必要があります。終了ノードは削除できません。
組み込み変数
do-while ノードは、${dag.variable_name} 形式を使用して変数を取得します。DataWorks は、${dag.loopTimes} と ${dag.offset} の 2 つのシステム組み込み変数を用意しています。また、do-while ノードを割り当てノードとともに使用し、${dag.variable_name} 形式を使用して割り当てパラメーターから値を取得することもできます。
システムの組み込み変数
各ループの反復処理で、組み込み変数を使用して現在のループ番号とオフセットを取得できます。
組み込み変数
説明
値
${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 ノードの[Input Parameters]として設定できます。これにより、do-while ノードは割り当てノードから結果セットと、その結果セット内の指定された行を取得できます。形式は ${dag.variable_name} です。ここで、variable_name は do-while ノードの[Input Parameters]として設定する必要があります。このトピックの例では、割り当てノードからの結果セットを受け取るために、do-while ノードに
inputパラメーター ([Input Parameters]) を定義します。実際には、これを実際のパラメーター名に置き換える必要があります。組み込み変数
説明
${dag.input}上流の割り当てノードから渡されたデータセット。
${dag.input[${dag.offset}]}現在のループのデータ行を取得します。
${dag.input.length}データセットの長さを取得します。
値の取得例
割り当てノードからの結果セットの形式は、その言語によって異なります。Shell ベースの割り当てノードから結果を取得するには、1次元配列 を使用します。ODPS SQL ベースの割り当てノードの場合は、2次元配列 を使用します。詳細については、「割り当てノード」をご参照ください。
例 1:Shell 割り当てノード
ノード出力
上流の割り当てノードは 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-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-40 years old| Cancer | | 0016359814159 | Unknown | 30-40 years old| Cancer | +----------------------------------------------+変数値
組み込み変数
ループ 1 の値
ループ 2 の値
${dag.input}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old| Cancer | | 0016359814159 | Unknown | 30-40 years old| Cancer | +----------------------------------------------+${dag.input[${dag.offset}]}0016359810821,Hubei Province,30-40 years old,Cancer0016359814159,Unknown,30-40 years old,Cancer${dag.input.length}2
説明データセットの長さは、2次元配列の行数です。
${dag.input[0][1]}説明2次元配列の 1 行目 2 列目の値。
Hubei Province
${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';この例では、終了ノードのコードは、テーブルの行数とループオフセットを固定値と比較することで、ループの総数を制限します。
Shell
if [ ${dag.loopTimes} -lt 5 ];
then
echo "True"
else
echo "False"
fiこのコードは、現在のループ番号 ${dag.loopTimes} を 5 と比較して、ループの総数を制限します。
例えば、${dag.loopTimes} は、最初のループでは 1、2 番目のループでは 2 です。5 回目のループでその値が 5 に達すると、条件は false になり、終了ノードは False を出力し、ループは終了します。
Python 2
if ${dag.loopTimes}<${dag.input.length}:
print True;
else
print False;
# 終了ノードが True を出力すると、次のループが開始します。
# 終了ノードが False を出力すると、ループは終了します。このコードは、現在のループ番号 (${dag.loopTimes}) を割り当てノードからのデータセットの長さと比較することで、ループの数を制限します。
ユースケース
割り当てノード
次の表は、do-while ノードを割り当てノードとともに使用する場合の一般的なシナリオと注意事項を示しています。
シナリオ | 設定 | パラメーター渡し |
|
| 割り当てノードの [出力パラメーター] には、デフォルトで |
ブランチノードとマージノード
次の表は、do-while ノードをブランチノードおよびマージノードとともに使用する場合の一般的なシナリオと注意事項を示しています。
ユースケース | 注意事項 |
do-while ノード内で論理判断を実行したり、結果を反復処理したりするには、ブランチノード (例えば | do-while ノード内では、ブランチノード (例えば |