ノードコンテキストパラメーターは、DataWorks においてタスクノード間で動的データを渡すためのコアメカニズムです。上流ノード (プロデューサー) は、その出力値を 1 つ以上の下流ノードに渡すことができます。下流ノードは、コード内でこれらの値を参照し、上流ノードの出力に基づいて動作を動的に調整できます。これにより、ワークフローの柔軟性と自動化が大幅に向上します。
仕組み
ノードコンテキストパラメーターは、上流ノード (プロデューサー) で出力パラメーターを定義し、下流ノード (コンシューマー) でそのパラメーターを参照することによって値を渡します。
-
上流ノード (プロデューサー):値を生成し、出力パラメーターとして提供します。値を提供するには 2 つの方法があります:
-
定数または変数の受け渡し:上流ノードの [ノード出力パラメーター] セクションでパラメーターを定義し、値を割り当てます。値は
'abc'のような定数、または${status}のようなシステムコンテキスト変数にすることができます。 -
代入結果の受け渡し:システムは、ノードコードの最後のクエリ結果 (例:
SELECT 'table_A';) をキャプチャし、outputsという名前の組み込み出力パラメーターに割り当て、このパラメーターの値を下流ノードに渡します。パラメーター値は、コードのランタイム結果に依存します。代入ノードと一部の SQL ノードがこの方法をサポートしています。
-
-
下流ノード (コンシューマー):上流ノードから提供された値を受け取り、使用します。
-
入力パラメーターの設定:下流ノードの [ノード入力パラメーター] セクションで、入力パラメーターを追加し、その値ソースを上流ノードの出力パラメーターに設定します。
-
スケジューリング依存関係の確立:入力パラメーターを設定すると、システムは自動的に下流ノードから上流ノードへの同一周期のスケジューリング依存関係を作成します。
-
コードでの参照:下流ノードのコード内で、
${InputParameterName}形式を使用して値を参照します。例えば、上流ノードが値table_Aを渡した場合、下流コードのSELECT * FROM ${input};は、ランタイム時にSELECT * FROM table_A;になります。
-
制限事項
-
エディション:一部のノードは、クエリ結果を渡すために使用される Add Assignment Parameter 機能をサポートしています。この機能には、DataWorks Standard Edition 以降のエディションが必要です。
-
ノードタイプ:[代入パラメーターの追加] 機能をサポートするノードタイプは、EMR Hive、EMR Spark SQL、ODPS スクリプト、Hologres SQL、AnalyticDB for PostgreSQL、ClickHouse SQL、および データベースノード です。
操作手順
ステップ 1:上流ノードでの出力パラメーターの設定
-
DataWorks コンソールにログインし、ターゲットリージョンに切り替えます。左側のナビゲーションウィンドウで をクリックします。ドロップダウンリストから目的のワークスペースを選択し、[DataStudio へ移動] をクリックします。
-
[データ開発] ペインで、ターゲットの上流ノードをダブルクリックしてエディターページを開きます。
-
キャンバスの右側で、Scheduling Settings をクリックします。Node Context Parameters セクションで、必要に応じて [ノード出力パラメーター] を設定する方法を選択します。
方法 1:定数または変数の受け渡し
-
[このノードの出力パラメーター] セクションで、[パラメーターの追加] をクリックします。
-
パラメーター情報を設定します。
パラメーター
説明
パラメーター名
出力パラメーターのカスタム名です。例:
my_param。パラメーター値
パラメーターの値です。次のタイプがサポートされています:
-
定数:
helloなど。 -
システムコンテキスト変数:
${status}など。 -
スケジューリングパラメーター:
$bizdateや、カスタムスケジューリングパラメーター${...}および$[...]など。
-
方法 2:代入結果の受け渡し
-
代入ノードの使用
代入ノード (上流ノード) は MaxCompute SQL、Python 2、および Shell をサポートしています。最後のクエリまたは出力の結果を、ノードの出力パラメーター (outputs) に自動的に割り当てます。下流ノードは、このパラメーターを参照して代入ノードの出力結果を取得できます。詳細については、「代入ノード」をご参照ください。
-
代入パラメーターの使用
代入パラメーターをサポートするノードで、次の手順を実行します:
-
[ノード出力パラメーター] セクションで、[代入パラメーターの追加] をクリックします。
-
システムは
outputsという名前の出力パラメーターを自動的に追加します。このパラメーターを設定する必要はありません。その値は、ノードコードの最後のクエリ結果です。 -
[保存] をクリックします。
説明Add Assignment Parameter をクリックすると、代入パラメーターはこのノードのクエリ結果を参照するすべての下流ノードに渡します。結果が空の場合、このノードの実行はブロックされませんが、パラメーターを参照する下流ノードは失敗する可能性があります。
具体的な例については、「代入ノード」の MaxCompute 言語の例をご参照ください。
-
出力パラメーターは削除できます。出力パラメーターを削除する前に、下流ノードがそれを使用していないことを確認してください。そうしないと、下流タスクの実行に影響します。
ステップ 2:下流ノードでのパラメーターの使用設定
-
入力パラメーターの設定
-
下流ノードのエディターページを開きます。 設定ページに移動します。[ノード入力パラメーター] セクションで、[パラメーターの追加] をクリックします。
-
入力パラメーターを設定します。このパラメーターの [値ソース] として上流ノードの出力パラメーターを選択し、このノードの [パラメーター名] を定義します。
-
ツールバーで [保存] をクリックしてパラメーターを保存します。
-
-
依存関係の確立
上流ノードの出力パラメーターをアタッチすると、システムはそのノードに対する同一周期の依存関係を自動的に追加します。手動で設定する必要はありません。
-
パラメーターの参照
下流ノードのコードで、
${InputParameterName}形式を使用してパラメーターを参照します。次の例は、Shell ノードで入力パラメーター
paramを参照する方法を示しています:echo "The value from upnode is ${param}"上流ノードが代入結果を下流ノードに渡す場合、パラメーター値は通常、2次元配列またはカンマ区切りの1次元配列です。次のように配列内の値にアクセスできます:
-
上流ノードが SQL ノードの場合 (2次元配列):
-
行:
${param}。 -
セル:
${param[j]}。
-
-
上流ノードが Python/Shell ノードの場合 (1次元配列):
行:${param}。
すべてのインデックスは 0 から始まります。
-
ステップ 3:デバッグと実行
コンテキストパラメーターは、ワークフローによってトリガーされる定期インスタンスでのみスケジューリング順に渡されます。下流ノードを単独で実行すると、上流パラメーターの取得に失敗し、タスクが失敗します。デバッグ時には、上流ノードから開始し、ビジネスフローの順序でノードを実行する必要があります。
-
ワークフローに戻り、ワークフローの上部にあるツールバーでRunをクリックするか、下流のノードを右クリックしてRun to this nodeを選択します。
-
生成された有向非巡回グラフ (DAG) インスタンスで、ノードをクリックしてその運用ログを表示し、結果が期待どおりであるかを確認します。
システムコンテキスト変数
|
システム変数 |
説明 |
|
${projectId} |
プロジェクト ID。 |
|
${projectName} |
MaxCompute プロジェクト名。 |
|
${nodeId} |
ノード ID。 |
|
${gmtdate} |
インスタンスのスケジュール時刻の日の 00:00:00。フォーマットは yyyy-MM-dd 00:00:00 です。 |
|
${taskId} |
タスクインスタンス ID。 |
|
${seq} |
タスクインスタンスの序数。同じ日に同じノードのインスタンスの中でのシーケンスを示します。 |
|
${cyctime} |
インスタンスのスケジュール時刻。 |
|
${status} |
インスタンスのステータス:成功 (SUCCESS) または失敗 (FAILURE)。 |
|
${bizdate} |
データタイムスタンプ。 |
|
${finishTime} |
インスタンスの終了時刻。 |
|
${taskType} |
インスタンスのランタイムタイプ:通常 (NORMAL)、手動 (MANUAL)、一時停止 (PAUSE)、ドライラン (SKIP)、未選択 (UNCHOOSE)、またはサイクルスキップ (SKIP_CYCLE)。 |
|
${nodeName} |
ノード名。 |