すべてのプロダクト
Search
ドキュメントセンター

DataWorks:for-each ノードのロジックの理解

最終更新日:Apr 21, 2026

DataWorks は for-each ノードを提供します。このノードを使用して、代入ノードからの結果セットをループ処理し、ビジネスフローをオーケストレーションできます。このトピックでは、for-each ノードのコンポーネントとロジックについて説明します。

注意事項

次の表に、for-each ノードの使用方法を説明します。

説明

リファレンス

for-each ノードを使用できる利用シーンについて説明します。

利用シーン

説明

これは、代入ノードから返された結果セットを走査するためにのみ使用されます。

最大走査回数、ノードのテスト方法、ログの表示方法など、for-each ノードの制限事項と注意事項について説明します。

制限事項注意事項

for-each ノード内のビジネスフローをカスタマイズする方法について説明します。フローは、組み込みの Start ノードで始まり、組み込みの End ノードで終わる必要があります。

ノードコンポーネントとフローオーケストレーション

for-each ノードの走査回数が、そのアップストリームの代入ノードの出力によって決定されることを説明します。

走査回数

for-each ノードが、各走査に関連する値を取得するための組み込み変数を提供することを説明します。

組み込み変数

変数値の取得方法と走査回数の計算方法の例を示します。

アップストリームの代入ノードが Shell または ODPS SQL ノードの場合の値の取得例

利用シーン

DataWorks の for-each ノードは、主にループを必要とするシナリオで使用されます。アップストリームの 代入ノード と一緒に使用する必要があります。for-each ノードは、代入ノードからの出力を受け取り、その結果をループ処理します。

for-each

制限事項

  • for-each ノードは、DataWorks Standard Edition 以降でのみサポートされています。詳細については、「バージョン別の機能詳細」をご参照ください。

  • for-each ノードは最大 1,024 回ループできます。実際の走査回数は、代入ノードから出力される結果セットによって決まります。

  • 同時実行はサポートされていません。新しいループは、前のループが完了した後にのみ開始できます。

注意事項

ディメンション

カテゴリ

説明

アップストリームとダウンストリームの依存関係

依存関係の設定

for-each ノードは、代入ノード から渡された値を走査します。したがって、代入ノードは for-each ノードのアップストリームノードである必要があります。

走査のサポート

最大走査回数

for-each ノードは最大 1,024 回のループをサポートします。この制限を超えると、実行時エラーが発生します。実際のループ回数は、アップストリームの代入ノードの出力によって制御されます。

走査回数

代入ノードから出力される結果セットによって決まります。

内部ノード

フローオーケストレーション

  • for-each ノードの内部ノード間の依存関係を削除し、内部ビジネスフローを再オーケストレーションできます。ただし、Start ノードEnd ノード は、それぞれ内部ビジネスフローの最初と最後のノードである必要があります。

  • for-each ノード内で 分岐ノード を使用して論理的な判断や結果の走査を行う場合は、マージノード も使用する必要があります。

値の取得

アップストリームの代入ノードから指定された値を取得するための組み込み変数が提供されます。

デバッグと実行

タスクのデバッグ

  • 標準モードでは、DataWorks は DataStudio インターフェイスでの for-each ノードの直接のテストと実行をサポートしていません。

    for-each ノードの実行結果をテスト・検証するには、for-each ノードを含むタスクをコミットして開発環境のオペレーションセンターに公開する必要があります。その後、開発環境のオペレーションセンターで for-each ノードタスクを実行してください。

  • 代入ノードと for-each ノードを同時に実行します。オペレーションセンターで定期タスクの データバックフィル 操作を実行する場合は、代入ノードからデータバックフィルを開始してください。これにより、代入ノードと for-each ノードの両方が確実に実行されます。for-each ノードを単独で実行しないでください。

ログの表示

オペレーションセンターで for-each ノードの実行ログを表示する際、インスタンスを右クリックして [内部ノードの表示] をクリックすると、内部ノードの実行ログを表示できます。

ノードコンポーネントとフローオーケストレーション

DataWorks の for-each ノードは、内部ノードを含む特殊なタイプのノードです。for-each ノードを作成すると、Start ノード (ループ開始)、Shell ノード (ループタスク)、および End ノード (ループ終了) の 3 つの内部ノードが自動的に作成されます。これらの内部ノードは、アップストリームの代入ノードの出力をループ処理する内部フローを形成します。for-each内部节点上の図に示すように:

  • 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 ループとの比較

${dag.loopDataArray}

代入ノードのデータセットを取得します。

for ループの次のコードに相当します:

data=[]

${dag.foreach.current}

現在の走査値を取得します。

次の for ループを例に取ります:

for(int i=0;i<data.length;i++) {
   print(data[i]);
}
  • data[i]${dag.foreach.current} に相当します。

  • i${dag.offset} に相当します。

${dag.offset}

現在のオフセット (最初の走査に対する各走査のオフセット)。

${dag.loopTimes}

現在の走査回数を取得します。

-

出力のテーブルスキーマがわかっている場合は、次の変数を使用して他の値を取得できます。

その他の変数

説明

${dag.foreach.current[n]}

アップストリームの代入ノードの出力が 2次元配列の場合、各走査中に現在のデータ行の特定の列のデータを取得します。

${dag.loopDataArray[i][j]}

アップストリームの代入ノードの出力が 2次元配列の場合、データセットの i 行 j 列のデータを取得します。

${dag.foreach.current[n]}

アップストリームの代入ノードの出力が 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-28

    2021-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,Cancer

    0016359814159,Unknown,30-40 years old,Cancer

    ${dag.offset}

    0

    1

    ${dag.loopTimes}

    1

    2

    ${dag.foreach.current[0]}

    0016359810821

    0016359814159

    ${dag.loopDataArray[1][0]}

    0016359814159