DataWorks は for-each ノードを提供します。このノードを使用して、代入ノードからの結果セットをループ処理し、ビジネスフローをオーケストレーションできます。このトピックでは、for-each ノードのコンポーネントとロジックについて説明します。
注意事項
次の表に、for-each ノードの使用方法を説明します。
説明 | リファレンス |
for-each ノードを使用できる利用シーンについて説明します。 | 説明 これは、代入ノードから返された結果セットを走査するためにのみ使用されます。 |
最大走査回数、ノードのテスト方法、ログの表示方法など、for-each ノードの制限事項と注意事項について説明します。 | |
for-each ノード内のビジネスフローをカスタマイズする方法について説明します。フローは、組み込みの Start ノードで始まり、組み込みの End ノードで終わる必要があります。 | |
for-each ノードの走査回数が、そのアップストリームの代入ノードの出力によって決定されることを説明します。 | |
for-each ノードが、各走査に関連する値を取得するための組み込み変数を提供することを説明します。 | |
変数値の取得方法と走査回数の計算方法の例を示します。 |
利用シーン
DataWorks の for-each ノードは、主にループを必要とするシナリオで使用されます。アップストリームの 代入ノード と一緒に使用する必要があります。for-each ノードは、代入ノードからの出力を受け取り、その結果をループ処理します。

制限事項
for-each ノードは、DataWorks Standard Edition 以降でのみサポートされています。詳細については、「バージョン別の機能詳細」をご参照ください。
for-each ノードは最大 1,024 回ループできます。実際の走査回数は、代入ノードから出力される結果セットによって決まります。
同時実行はサポートされていません。新しいループは、前のループが完了した後にのみ開始できます。
注意事項
ディメンション | カテゴリ | 説明 |
アップストリームとダウンストリームの依存関係 | 依存関係の設定 | for-each ノードは、代入ノード から渡された値を走査します。したがって、代入ノードは for-each ノードのアップストリームノードである必要があります。 |
走査のサポート | 最大走査回数 | for-each ノードは最大 1,024 回のループをサポートします。この制限を超えると、実行時エラーが発生します。実際のループ回数は、アップストリームの代入ノードの出力によって制御されます。 |
走査回数 | 代入ノードから出力される結果セットによって決まります。 | |
内部ノード | フローオーケストレーション | |
値の取得 | アップストリームの代入ノードから指定された値を取得するための組み込み変数が提供されます。 | |
デバッグと実行 | タスクのデバッグ |
|
ログの表示 | オペレーションセンターで for-each ノードの実行ログを表示する際、インスタンスを右クリックして [内部ノードの表示] をクリックすると、内部ノードの実行ログを表示できます。 |
ノードコンポーネントとフローオーケストレーション
DataWorks の for-each ノードは、内部ノードを含む特殊なタイプのノードです。for-each ノードを作成すると、Start ノード (ループ開始)、Shell ノード (ループタスク)、および End ノード (ループ終了) の 3 つの内部ノードが自動的に作成されます。これらの内部ノードは、アップストリームの代入ノードの出力をループ処理する内部フローを形成します。
上の図に示すように:
Shell ノード
デフォルトでは、DataWorks はタスクを実行するために Shell 内部ノードを作成します。デフォルトの Shell ノード を削除し、ループ走査タスク用にノードをカスタマイズすることもできます。
ループ走査タスクが Shell タスクの場合、Shell ノード をダブルクリックしてコードエディタを開き、タスクコードを開発できます。
ループ走査タスクが複雑な場合は、内部フローに他のタスクノードを作成し、必要に応じてノードの実行プロセスを再構築できます。
説明ループタスクノードをカスタマイズする場合、内部ノード間の依存関係を削除し、内部フローを再オーケストレーションできます。ただし、Start ノード と End ノード は、内部フローの最初と最後のノードである必要があります。
Start ノード と End ノード
これらは、内部フローの各ループの開始ノードと終了ノードです。特定のタスクコードは含まれていません。
説明for-each ノードの End ノードはループ回数を制御しません。ループ回数は、アップストリームの代入ノードの出力によって決まります。
走査回数
for-each ノードは最大 1,024 回ループできます。実際の走査回数は、代入ノードから出力される結果セットによって決まります。
走査回数は、代入ノードから出力される結果セットによって決まります:
Shell と Python の走査:出力は 1次元配列です。ループ回数は配列内の要素の数です。要素はカンマで区切られます。
たとえば、代入ノードの代入言語が Shell または Python (Python 2) で、出力が 1次元配列
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01の場合、for-each ノードは 5 回ループします。SQL の走査:出力は 2次元配列です。ループ回数は配列内の行数です。
たとえば、代入ノードの代入言語が ODPS SQL で、出力が 2次元配列の場合:
+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+for-each ノードは 2 回ループします。
組み込み変数
for-each ノードの内部ノードで以下のメソッドを使用して、アップストリームの代入ノードから結果セットを取得できます。for-each ノードの内部フローに代入ノードが存在する場合、ダウンストリームノードのデフォルトの値取得メソッドを使用して値を取得できます。値の取得メソッドの詳細については、「代入ノード」をご参照ください。
DataWorks の for-each ノードが代入ノードの出力をループ処理する場合、組み込み変数を使用して現在のループ番号とオフセットを取得できます。
組み込み変数 | 説明 | for ループとの比較 |
| 代入ノードのデータセットを取得します。 | for ループの次のコードに相当します: |
| 現在の走査値を取得します。 | 次の for ループを例に取ります:
|
| 現在のオフセット (最初の走査に対する各走査のオフセット)。 | |
| 現在の走査回数を取得します。 | - |
出力のテーブルスキーマがわかっている場合は、次の変数を使用して他の値を取得できます。
その他の変数 | 説明 |
| アップストリームの代入ノードの出力が 2次元配列の場合、各走査中に現在のデータ行の特定の列のデータを取得します。 |
| アップストリームの代入ノードの出力が 2次元配列の場合、データセットの i 行 j 列のデータを取得します。 |
| アップストリームの代入ノードの出力が 1次元配列の場合、特定のインデックスのデータを取得します。 |
組み込み変数の使用例
例 1:アップストリームの代入ノードが Shell ノードの場合
代入ノードの出力
アップストリームの代入ノードは Shell ノードです。最終的な出力は
2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01です。for-each ノードでの値の取得
説明出力はカンマで区切られた 5 つの要素を持つ 1次元配列であるため、for-each ノードは 5 回ループします。
組み込み変数
1 回目のループでの値
2 回目のループでの値
${dag.loopDataArray}2021-03-28,2021-03-29,2021-03-30,2021-03-31,2021-04-01${dag.foreach.current}2021-03-282021-03-29${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[3]}2021-03-30
例 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 | +----------------------------------------------+for-each ノードでの値の取得
説明出力は 2 行の 2次元配列であるため、for-each ノードは 2 回走査します。
組み込み変数
1 回目のループでの値
2 回目のループでの値
${dag.loopDataArray}+----------------------------------------------+ | uid | region | age_range | zodiac | +----------------------------------------------+ | 0016359810821 | Hubei Province | 30-40 years old | Cancer | | 0016359814159 | Unknown | 30-40 years old | Cancer | +----------------------------------------------+${dag.foreach.current}0016359810821,Hubei Province,30-40 years old,Cancer0016359814159,Unknown,30-40 years old,Cancer${dag.offset}0
1
${dag.loopTimes}1
2
${dag.foreach.current[0]}00163598108210016359814159${dag.loopDataArray[1][0]}0016359814159