複雑なデータワークフローでは、ノード間で動的な情報を渡す必要があることがよくあります。一般的な方法は中間テーブルを使用することですが、このアプローチは少量のデータを渡すには非常に非効率的であり、不要な I/O と複雑さを増します。代入ノードは軽量なソリューションを提供します。短いスクリプト (ODPS SQL、Python 2、または Shell) を実行し、その出力を下流ノードにパラメーターとして直接渡します。これにより、上流タスクの結果に基づいてタスクが動的に構成される柔軟なパイプラインを構築できます。
使用上の注意
エディション: DataWorks Standard Edition 以上。
権限: RAM ユーザーをターゲットワークスペースに追加し、必要な開発者権限を付与する必要があります。
仕組み
代入ノードのコア機能はパラメーターの受け渡しです。つまり、代入ノードから下流ノードにデータを転送します。
代入ノードは、最後の出力またはクエリ結果を、
outputsという名前のシステム生成のノード出力パラメーターに自動的に割り当てることによってデータを生成します。下流ノードがデータを消費します。ノード入力パラメーター (例: param) を追加して、
outputsを使用するように構成します。
パラメーターのフォーマット
outputs パラメーターの値とフォーマットは、使用されるスクリプト言語によって異なります。
言語 | 値 | フォーマット |
ODPS SQL | 最後の | 結果セットは 2 次元配列として渡されます。 |
Python 2 | 最後の | 出力は単一の文字列として扱われ、カンマ ( |
Shell | 最後の |
手順
代入ノードの結果は、任意の下流ノードに渡すことができます。次の例では、Shell ノードを使用してこのワークフローを説明します。
代入ノードを構成します。
DataWorks コンソールにログインします。左側のナビゲーションウィンドウで、 をクリックします。
ワークフローで、代入ノードを作成して編集します。ノード構成ページで、言語として [ODPS SQL] を選択し、コードを記述します。
select * from xc_dpe_e2.xc_rpt_user_info_d where dt='20191008' limit 10;(オプション) 右側のペインで [プロパティ] をクリックします。[入出力パラメーター] タブで、システムはこのノードの出力パラメーター
outputsを自動的に作成します。
Shell ノードを構成します。
Shell ノードを作成し、ワークフローキャンバスで代入ノードから Shell ノードに接続をドラッグして、代入ノードの下流ノードとして設定します。
Shell ノードの構成ページで、右側のペインにある [プロパティ] をクリックし、[入出力パラメーター] タブを選択します。
[入力パラメーター] セクションで、[作成] をクリックします。
表示されるダイアログボックスで、代入ノードから
outputsパラメーターを選択し、現在のノードの入力パラメーターの名前 (param など) を指定します。この構成により、下流ノードと代入ノードの間に依存関係が自動的に作成されます。
パラメーターを構成した後、
${param}フォーマットを使用して、Shell ノードのコードで渡された値を参照します。echo '${param}'; echo 'First row: '${param[0]}; echo 'Second field of the first row: '${param[0][1]};${...}変数アクセス構文 (配列のインデックス作成を含む) は、標準の Shell 構文ではありません。DataWorks は、実行前にこれらの変数を前処理して静的に置き換えます。たとえば、DataWorks は、最終的なスクリプトを Shell に送信して実行する前に、${param[0][1]}を代入ノードから取得した実際の値に置き換えます。
結果を実行して検証します。
ビジネスフロー名をダブルクリックして開きます。ワークフロー構成ページで、ツールバーの [実行] をクリックしてワークフローを実行し、結果を検証します。または、ノードを開発環境にコミットした後、[オペレーションセンター] に移動し、データバックフィルを使用して実行をテストします。
制限事項
パラメーターは、直後の下流ノードにのみ渡すことができます。
サイズ制限:
outputsは 2 MB を超えることはできません。超えた場合、代入ノードは失敗します。構文の制限:
代入ノードのコードにコメントを含めないでください。コメントは出力の解析を妨げ、ノードの失敗や不正な値の生成を引き起こす可能性があります。
WITH句は ODPS SQL モードではサポートされていません。
言語別の例
outputs のデータフォーマットと参照メソッドは言語によって異なります。
例 1: ODPS SQL クエリ結果を渡す
SQL クエリの結果は、2 次元配列として Shell ノードに渡されます。
代入ノード
SELECTクエリを記述します。select * from xc_dpe_e2.xc_rpt_user_info_d where dt='20191008' limit 2;Shell ノード
代入ノードの
outputsを参照するparamという名前の入力パラメーターを追加します。次のスクリプトを使用してデータを読み取ります。# 2D 配列全体を出力 echo "Full result set: ${param}" # 最初の行 (1D 配列) を出力 echo "First row: ${param[0]}" # 最初の行の 2 番目のフィールドを出力 echo "Second field of the first row: ${param[0][1]}"期待される出力
DataWorks はパラメーターを解析して静的な置き換えを実行し、次のような出力を生成します (値はデータによって異なります):
Full result set: value1,value2 value3,value4 First row: value1,value2 Second field of the first row: value2
例 2: Python 2 の出力を渡す
Python 2 の print 文の出力は、カンマ (,) で分割され、1 次元配列として渡されます。
代入ノード
Python 2 のコードは次のとおりです:
print "hello,dataworks";Shell ノード
代入ノードの
outputsを参照するparamという名前の入力パラメーターを追加します。次のスクリプトを使用してデータを読み取ります。# 1D 配列全体を出力 echo "Full result set: ${param}" # インデックスで要素を出力 echo "First element: ${param[0]}" echo "Second element: ${param[1]}"期待される出力
DataWorks はパラメーターを解析して静的な置き換えを実行し、次の出力を生成します。
Full result set: "hello","dataworks" First element: hello Second element: dataworks
例 3: Shell の出力を渡す
Shell の echo 文の出力は、カンマ (,) で分割され、1 次元配列として渡されます。
代入ノード
Shell のコードは次のとおりです:
echo "hello,dataworks";Shell ノード
代入ノードの
outputsを参照するparamという名前の入力パラメーターを追加します。次のスクリプトを使用してデータを読み取ります。# 1D 配列全体を出力 echo "Full result set: ${param}" # インデックスで要素を出力 echo "First element: ${param[0]}" echo "Second element: ${param[1]}"期待される出力
DataWorks はパラメーターを解析して静的な置き換えを実行し、次の出力を生成します。
Full result set: "hello","dataworks" First element: hello Second element: dataworks
その他のユースケース
ループノードでの使用
下流ノードが for-each または do-while ノードの場合は、「for-each ノードの設定」および「do-while ノードの設定」をご参照ください。
他のノードタイプにおける組み込みパラメーター割り当て
代入ノードは ODPS SQL、Python 2、および Shell のみをサポートします。ただし、他の多くのノードタイプでは、組み込みのパラメーター割り当て機能を使用して同じ目標を達成し、ワークフローを簡素化できます。これらのノードには、EMR Hive、Hologres SQL、EMR Spark SQL、AnalyticDB for PostgreSQL、ClickHouse SQL、および MySQL が含まれます。