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

DataWorks:for-each ノード

最終更新日:Jun 21, 2025

DataWorks は、for-each ノードを提供します。 for-each ノードを使用すると、代入ノードによって渡された結果セットをループ処理できます。また、for-each ノードの内部ノードをカスタマイズすることもできます。このトピックでは、for-each ノードの構成とアプリケーションロジックについて説明します。

ノードの紹介

DataWorks の for-each ノードはループ走査シナリオで使用され、代入ノードと共に使用する必要があります。代入ノードは、for-each ノードの祖先ノードとして構成する必要があります。代入ノードがその出力を for-each ノードに渡した後、for-each ノードは出力をループ処理します。

前提条件

  • 使用する RAM ユーザーがワークスペースに追加されます。

    RAM ユーザーを使用してタスクを開発する場合、RAM ユーザーをメンバーとしてワークスペースに追加し、[開発] ロールまたは [ワークスペース管理者] ロールを RAM ユーザーに割り当てる必要があります。ワークスペース管理者ロールには、必要以上の権限があります。 ワークスペース管理者ロールを割り当てる場合は注意してください。メンバーを追加してロールを割り当てる方法の詳細については、「ワークスペースメンバーを追加し、ロールを割り当てる」をご参照ください。

  • サーバーレスリソースグループがワークスペースに関連付けられています。詳細については、「サーバーレスリソースグループを使用する」ディレクトリのトピックをご参照ください。

  • ノードでタスクを開発する前に、for-each ノードが作成されます。詳細については、「タスクノードを作成する」をご参照ください。

制限

  • DataWorks Standard Edition 以降のエディションのみが for-each ノードをサポートしています。詳細については、「DataWorks エディション間の違い」をご参照ください。

  • 並列実行はサポートされていません。ループは、前のループが終了した場合にのみ開始できます。

注意事項

ディメンション

項目

説明

依存関係

依存関係の設定

for-each ノードは、代入ノードによって渡された値をループ処理する必要があります。したがって、代入ノードは、for-each ノードの祖先ノードとして構成する必要があります。 for-each ノードは、代入ノードに依存する必要があります。

走査サポート

ループ数の上限

for-each ノードは、代入ノードと共に使用する必要があります。 for-each ノードを使用するには、最初に [プロパティ] タブの loopDataArray パラメーターのコンテキストパラメーターを構成し、次にループ本体でノードロジックを定義する必要があります。許可されるループの最大数は 128 です。実行されるループの実際の数は、代入ノードによって渡される結果セットによって決まります。

ループ数

for-each ノードのループ数は、代入ノードによって渡される結果セットによって決まります。

内部ノード

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

  • for-each ノードの内部ノード間の既存の依存関係を削除し、ビジネス要件に基づいて内部ノード間の依存関係を構成できます。ただし、内部ワークフローが [開始ノード] で始まり、[終了ノード] で終わることを確認する必要があります。

  • for-each ノードの内部コードが 分岐ノード を使用して論理判断を実行するか、代入ノードの結果をループする場合、マージノード も必要です。

値の取得

for-each ノードによって提供される組み込み変数を使用して、for-each ノードの祖先ノードとして構成されている代入ノードによって渡される特定の値を取得できます。

デバッグ

ノードのデバッグ

  • 標準モードでワークスペースを使用する場合、Data Studio で for-each ノードを実行するテストを直接実行することはできません。

    テストを実行して for-each ノードの実行結果を確認する場合は、for-each ノードを含むノードを開発環境の Operation Center にコミットしてデプロイし、for-each ノードを実行する必要があります。

  • 代入ノードと for-each ノードを同時に実行する必要があります。 Operation Center で代入ノードがその出力を for-each ノードに渡すかどうかを確認する場合は、データバックフィル 機能を使用して、代入ノードと for-each ノードの両方のデータをバックフィルできます。 for-each ノードのみを実行する場合、代入ノードの出力を取得することはできません。

ログの表示

Operation Center で for-each ノードの操作ログを表示するには、次の手順を実行します。 [サイクルタスク] ページで for-each ノードを見つけ、ノードの有向非巡回グラフ (DAG) を開きます。 DAG で、ノード名を右クリックし、[内部ノードの表示] を選択して、内部ノードの操作ログを表示します。

組み込み変数

for-each ノードによって提供される組み込み変数を使用して、for-each ノードの祖先ノードとして構成されている代入ノードによって渡される結果セットを取得できます。 for-each ノードの内部ワークフローに代入ノードが含まれている場合、デフォルトのメソッドを使用して代入ノードの出力を取得できます。

  • DataWorks で for-each ノードによって提供される組み込み変数を使用して、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]}

    for-each ノードの祖先ノードとして構成されている代入ノードの出力が 2 次元配列の場合、この変数は、for-each ノードが代入ノードの出力をループで走査するときに、現在のデータエントリの特定の列のデータを取得するために使用されます。

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

    for-each ノードの祖先ノードとして構成されている代入ノードの出力が 2 次元配列の場合、この変数は、代入ノードのデータセットの行 i と列 j のデータを取得するために使用されます。

    ${dag.foreach.current[n]}

    for-each ノードの祖先ノードとして構成されている代入ノードの出力が 1 次元配列の場合、この変数は、特定の列のデータを取得するために使用されます。

for-each ノードの開発説明

for-each ノードは、DataWorks に内部ノードを含む特殊なノードの一種です。 for-each ノードを作成した後、for-each ノードをダブルクリックしてループ本体を構成できます。ループ本体に内部ノードを作成し、内部ノードをワークフローに編成して、代入ノードの出力をループ処理できます。

  • for-each ノードの依存関係を構成します。

    for-each ノードは、代入ノードに依存する必要があります。

  • for-each ノードへの入力を構成します。

    for-each ノードの [プロパティ] タブの [入力および出力パラメーター] セクションで、[出力] という名前の代入ノードの組み込み出力パラメーターを、入力パラメーターとして for-each ノードの [入力パラメーター] に追加します。 代入ノードの構成方法については、「代入ノード」をご参照ください。

  • for-each ノードの内部ノードを構成して、for-each ノードの入力パラメーターを取得します。

    ビジネス要件に基づいて for-each ノードの内部ワークフローを構成し、ワークフロー内の内部ノードの組み込み変数を構成して入力パラメーターに必要な値を取得してから、for-each ノードを実行できます。

説明

for-each ノードをテストします。 Data Studio では for-each ノードをテストできません。

1. 代入ノードを構成する

  1. 代入ノードの構成タブに移動し、右下隅で言語モードを Shell に切り替えます。

  2. 代入ノードの構成タブで、次のテストステートメントを記述します。

    echo 'this is name,ok';
  3. 構成が完了したら、代入ノードのスケジューリングプロパティを構成し、代入ノードの outputs パラメーターを表示します。詳細については、「ノードのスケジューリング」をご参照ください。

  4. スケジューリングプロパティを完了したら、ツールバーの image アイコンをクリックして代入ノードを保存します。

2. for-each ノードを構成する

for-each ノードの構成タブに移動して、for-each ノードのループ本体を構成します。デフォルトでは、for-each ノードは、image 開始ノード、image 終了ノード、および for-each ループ本体で構成されます。

  1. for-each ループ本体の横にある [内部ノードの作成] をクリックします。表示されるポップオーバーで、[Shell] を選択し、Shell ノードの名前を指定します。

  2. Shell ノードを構成します。

    1. ループ本体で作成された Shell ノードにポインターを移動し、Shell ノードの名前を右クリックして、[ノードを開く] を選択して Shell ノードの構成タブに移動します。

    2. Shell ノードのコードを記述します。

      echo ${dag.loopTimes} ---- 現在のループ数を表示します。//現在のループ数を表示します。
      
      説明
      • for-each ノードの image 開始ノードと image 終了ノードのロジックは固定されており、変更できません。

      • Shell ノードのコードを変更した後、変更を保存します。ノードをコミットすると、システムは変更を保存するように促すメッセージを表示しません。変更を保存しないと、コードをできるだけ早く最新バージョンに更新できません。

      for-each ノードは、次の環境変数をサポートしています。

      • ${dag.foreach.current}: 現在のデータエントリ。

      • ${dag.loopDataArray}: 入力データセット。

      • ${dag.offset}: オフセット。

      • ${dag.loopTimes}: ループカウント。その値は ${dag.offset} の値に 1 を加えた値と同じです。

  3. ループ本体の Shell ノードを構成します。

    1. ループ本体の Shell ノードの構成タブで、右側のナビゲーションウィンドウの [プロパティ] タブをクリックします。

    2. [スケジューリングパラメーター] セクションで、[パラメーターの追加] をクリックします。

    3. image[パラメーター値] の横にあるをクリックして、代入ノードの出力をパラメーターとして関連付けます。

      説明

      代入ノードを for-each ノードの祖先ノードとして構成した後、[プロパティ] タブで for-each ノードの入力パラメーターを構成する必要があります。入力パラメーターを指定しないと、for-each ノードをコミットするときにエラーが発生します。

  4. 上部ツールバーの image アイコンをクリックして、ループ本体の Shell ノードを保存します。

  5. 上記の構成が完了したら、ワークフローに戻り、for-each ノードのスケジューリングプロパティを構成します。次に、for-each ノードをデプロイします。詳細については、「ノードのスケジューリング」および「ノードまたはワークフローのデプロイ」をご参照ください。

3. for-each ノードをテストし、テスト結果を表示する

  1. デプロイメントが完了したら、[Operation Center][自動トリガーノード] ページに移動して、デプロイされているノードを表示し、ノードで O&M 操作を実行します。システムは、構成したスケジューリング設定に基づいて、ノードを定期的に実行します。

  2. [自動トリガーノード] ページで、代入ノードを見つけ、[アクション] 列の [データのバックフィル] をクリックし、[遡及的に現在のノードと子孫ノード] を選択して、代入ノードと for-each ノードのデータをバックフィルします。詳細については、「データのバックフィルとデータバックフィルインスタンスの表示 (新バージョン)」をご参照ください。