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 ノードの祖先ノードとして構成されている代入ノードによって渡される特定の値を取得できます。 | |
デバッグ | ノードのデバッグ |
|
ログの表示 | 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. 代入ノードを構成する
代入ノードの構成タブに移動し、右下隅で言語モードを Shell に切り替えます。
代入ノードの構成タブで、次のテストステートメントを記述します。
echo 'this is name,ok';
構成が完了したら、代入ノードのスケジューリングプロパティを構成し、代入ノードの
outputs
パラメーターを表示します。詳細については、「ノードのスケジューリング」をご参照ください。スケジューリングプロパティを完了したら、ツールバーの
アイコンをクリックして代入ノードを保存します。
2. for-each ノードを構成する
for-each ノードの構成タブに移動して、for-each ノードのループ本体を構成します。デフォルトでは、for-each ノードは、 開始ノード、
終了ノード、および for-each ループ本体で構成されます。
for-each ループ本体の横にある [内部ノードの作成] をクリックします。表示されるポップオーバーで、[Shell] を選択し、Shell ノードの名前を指定します。
Shell ノードを構成します。
ループ本体で作成された Shell ノードにポインターを移動し、Shell ノードの名前を右クリックして、[ノードを開く] を選択して Shell ノードの構成タブに移動します。
Shell ノードのコードを記述します。
echo ${dag.loopTimes} ---- 現在のループ数を表示します。//現在のループ数を表示します。
説明for-each ノードの
開始ノードと
終了ノードのロジックは固定されており、変更できません。
Shell ノードのコードを変更した後、変更を保存します。ノードをコミットすると、システムは変更を保存するように促すメッセージを表示しません。変更を保存しないと、コードをできるだけ早く最新バージョンに更新できません。
for-each ノードは、次の環境変数をサポートしています。
${dag.foreach.current}
: 現在のデータエントリ。${dag.loopDataArray}
: 入力データセット。${dag.offset}
: オフセット。${dag.loopTimes}
: ループカウント。その値は${dag.offset}
の値に 1 を加えた値と同じです。
ループ本体の Shell ノードを構成します。
ループ本体の Shell ノードの構成タブで、右側のナビゲーションウィンドウの [プロパティ] タブをクリックします。
[スケジューリングパラメーター] セクションで、[パラメーターの追加] をクリックします。
を [パラメーター値] の横にあるをクリックして、代入ノードの出力をパラメーターとして関連付けます。
説明代入ノードを for-each ノードの祖先ノードとして構成した後、[プロパティ] タブで for-each ノードの入力パラメーターを構成する必要があります。入力パラメーターを指定しないと、for-each ノードをコミットするときにエラーが発生します。
上部ツールバーの
アイコンをクリックして、ループ本体の Shell ノードを保存します。
上記の構成が完了したら、ワークフローに戻り、for-each ノードのスケジューリングプロパティを構成します。次に、for-each ノードをデプロイします。詳細については、「ノードのスケジューリング」および「ノードまたはワークフローのデプロイ」をご参照ください。
3. for-each ノードをテストし、テスト結果を表示する
デプロイメントが完了したら、[Operation Center] の [自動トリガーノード] ページに移動して、デプロイされているノードを表示し、ノードで O&M 操作を実行します。システムは、構成したスケジューリング設定に基づいて、ノードを定期的に実行します。
[自動トリガーノード] ページで、代入ノードを見つけ、[アクション] 列の [データのバックフィル] をクリックし、[遡及的に現在のノードと子孫ノード] を選択して、代入ノードと for-each ノードのデータをバックフィルします。詳細については、「データのバックフィルとデータバックフィルインスタンスの表示 (新バージョン)」をご参照ください。