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

DataWorks:割り当てノード

最終更新日:Aug 13, 2026

割り当てノードは、上流ノードのクエリ結果または出力を下流ノードに渡します。このノードは MaxCompute SQL、Python 2、シェルをサポートしており、最後のクエリまたは出力結果をノードの出力パラメーター (outputs) に自動的に割り当てます。下流ノードは、このパラメーターを参照して結果を取得します。

使用上の注意

  • バージョン要件:DataWorks Standard Edition 以降でのみ利用可能です。

  • 権限:ご使用の RAM アカウントを対象の ワークスペース に追加し、開発者 または ワークスペース管理者 のロールを割り当てる必要があります。詳細については、「ワークスペースへのメンバー追加」をご参照ください。

主要な概念:パラメーター渡しと参照

割り当てノードの中核機能は、上流ノードから下流ノードへデータを転送するパラメーター渡しです。

  • 上流割り当てノード: データを生成し、最後の出力またはクエリ結果を outputs という名前のシステム生成出力パラメーターに自動的に割り当てます。

  • 下流ビジネスノード: データを受信して使用します。[入力パラメーター] (たとえば、param) を設定して、その値が上流ノードの outputs パラメーターを参照するようにします。これにより、コードでデータが利用可能になります。

    image

パラメーターの形式

以下の表で、渡されるパラメーターの形式を説明します。

言語

値

形式

MaxCompute SQL

最後の SELECT 文の出力。

ノードは出力を二次元配列として下流ノードに渡します。

Python 2

最後の print ステートメントの出力。

DataWorks は、出力文字列をカンマ (,) で分割して1次元配列にします。

例えば、代入ノードの最終行が 'Electronics,Clothing,Books' を出力する場合、下流ノードに渡される値は ['Electronics','Clothing','Books'] です。
重要

出力自体にカンマが含まれている場合は、カンマをエスケープする必要があります。たとえば、出力が 'Electronics,Clothing\, Shoes & Accessories' の場合、下流ノードはそれを ['Electronics', 'Clothing, Shoes & Accessories'] として正しく解析します。

シェル

最後の echo ステートメントの出力。

手順

以下の例では、割り当てノードの結果をシェルノードに渡すことで、一般的な手順を説明します。実際には、任意のノードタイプを下流ノードとして使用できます。

  1. 上流の割り当てノードの設定

    対象のワークフローで、割り当てノードを作成・編集します。MaxCompute SQL、Python 2、またはシェルを選択し、下流ノードに渡したい結果を生成するコードを記述します。

    print '10,20,30,40'
  2. 下流のシェルノードの設定

    シェルノードを作成します。シェルノードの編集ページで、上流ノードの結果を参照します。

    1. 右側のスケジューリング設定 パネルで、ノードコンテキストパラメーター タブを選択します。

    2. ノードの入力パラメータ セクションで、パラメーターの追加 をクリックします。

    3. 表示されるダイアログで、上流ノードの出力パラメーターを、前のステップで設定した代入ノードの outputs パラメーターに設定し、現在のノードの入力パラメーターにカスタムの パラメータ名 を指定します (たとえば、param)。

      説明

      設定後、下流ノードは自動的に上流の割り当てノードへの依存関係を確立します。

    4. パラメーター設定後、上流ノードから渡された値は、下流 Shell ノードのコードで ${param} 形式で使用できます。

  3. 下流の Data Integration ノードの設定

    実際には、Data Integration のオフライン同期ノードも、割り当てノードの下流ノードとして使用できます。

    1. Data Integration のオフライン同期ノードを作成し、割り当てノードの下流ノードとして接続します。

    2. オフライン同期ノードのスケジューリング設定ページで、ノードコンテキストパラメーター タブをクリックします。

    3. パラメーターの追加 をクリックして入力パラメーターを追加し、その値のソースを上流の代入ノードの outputs パラメーターに設定します。

    4. ノードコードでパラメーターを参照するには、パラメーターが文字列型の場合は値を二重引用符 ("") で囲み、文字列型以外の場合は引用符を追加しません。

  4. 結果の検証

    1. ワークフローに戻り、ツールバーの [Deploy] をクリックします。フルデプロイメントを選択します。

    2. オペレーションセンターの タスクの運用保守 > 定期タスクの運用保守 > 定期タスク ページに移動し、スモークテストを実行します。

    3. テストインスタンスで、最終結果が期待どおりかを確認します。

OpenAPI を使用した割り当てノードの作成

DataWorks OpenAPI の CreateNode オペレーションを呼び出して、割り当てノードを作成することもできます。 API を使用してノードを作成する場合は、FlowSpec の Spec パラメーターでノード情報を設定します。

リソースグループを関連付けるには、FlowSpec の runtimeResource.resourceGroup フィールドにリソースグループ識別子を指定します。 例:

{
  "version": "1.1.0",
  "kind": "Node",
  "spec": {
    "nodes": [
      {
        "recurrence": "Normal",
        "script": {
          "runtime": {
            "command": "CONTROLLER_ASSIGNMENT"
          },
          "content": "print '10,20,30'"
        },
        "runtimeResource": {
          "resourceGroup": "S_res_group_XXX_XXXX"
        },
        "name": "assignment_node_demo"
      }
    ]
  }
}

カスタムコードを使用して API を呼び出す場合は、Alibaba Cloud 公式 SDK と同じ方法でパラメーターが渡されるようにしてください。そうしないと、リソースグループの関連付けが有効にならない可能性があります。

注意事項

  • 受け渡し階層:割り当てノードのパラメーターは、直下の下流ノードにのみ渡すことができます。レベルを越えたパラメーター渡しはサポートされていません。

  • サイズ制限:渡される値の最大サイズは 2 MB です。出力がこの制限を超えると、割り当てノードは失敗します。

  • 構文上の制限:

    • 割り当てノードのコードでは、コメントはサポートされていません。コメントを追加すると、予期しない結果になることがあります。

    • MaxCompute SQL モードでは、WITH 構文はサポートされていません。

  • データソース要件:MaxCompute SQL を使用して値を割り当てる場合は、MaxCompute コンピューティングリソースを設定し、対応する MaxCompute データソースを選択する必要があります。Python またはシェルを使用して値を割り当てる場合は、MaxCompute データソースを設定する必要はありません。割り当て結果を、ブランチノードなどの下流ノードに直接渡すことができます。

例:言語別の詳細な説明

outputs の出力形式と、下流ノードがそれを参照する方法は、言語によって異なります。以下の例では、下流ノードとしてシェルノードを使用します。

例 1:MaxCompute SQL クエリ結果の受け渡し

SQL クエリの結果は、二次元配列として下流ノードに渡されます。

  • 上流ノード (割り当てノード - SQL) の設定

    以下の SQL コードで、クエリが 2 行 2 列のデータを返すと仮定します。

    SELECT 'beijing', '1001'
    UNION ALL 
    SELECT 'hangzhou', '1002';
  • 下流ノード (シェルノード) の設定と出力

    Shell ノードで、region という名前の入力パラメーターを追加し、上流の SQL ノードの outputs パラメーターを参照します。

    次のコードを記述してデータを読み取ります。

    echo "Entire result set: ${region}"
    echo "First row: ${region[0]}"
    echo "First row, second field: ${region[0][1]}"

    DataWorks はパラメーターを直接解析し、静的な置換を実行します。出力は次のようになります。

    Entire result set: beijing,1001
    hangzhou,1002
    First row: beijing,1001
    First row, second field: 1001

例 2:Python 2 出力結果の受け渡し

Python 2 の print 文の出力は、カンマ (,) で区切られ、1 次元の配列として下流ノードに渡されます。

  • 上流ノード (割り当てノード - Python 2) の設定

    Python 2 のコードは次のとおりです。

    print 'Electronics, Clothing, Books';
  • 下流ノード (シェルノード) の設定と出力

    Shell ノードで、types という名前の入力パラメーターを追加し、上流の割り当てノードの outputs パラメーターを参照します。

    次のコードを記述してデータを読み取ります。

    # 一次元配列全体を直接出力
    echo "Entire result set: ${types}"
    
    # インデックスで要素を出力
    echo "Second element: ${types[1]}"

    DataWorks はパラメーターを直接解析し、静的な置換を実行します。出力は次のようになります。

    Entire result set: Electronics, Clothing, Books
    Second element:  Clothing
説明

シェルノードの処理ロジックは Python 2 と類似しているため、ここでは繰り返しません。

シナリオ:複数のビジネスラインにまたがるパーティションテーブルデータの一括処理

この例では、割り当てノードと for-each ノードを使用して、複数のビジネスラインにわたるユーザー行動データを一括処理する方法を示します。これにより、単一のロジックで複数の製品ラインに対応するデータ処理を自動化します。

image

背景情報

ある総合インターネット企業でデータ開発エンジニアであると仮定します。あなたは3つの主要ビジネスライン (eコマース (ecom)、金融 (finance)、物流 (logistics)) のデータを処理しており、将来的にはさらに追加される可能性があります。毎日、これら 3 つのビジネスラインのユーザー行動ログに対して同じ集計ロジックを実行し、ユーザーごとの日次ページビュー (PV) を計算し、その結果を統一された集計テーブルに保存する必要があります。

  • 上流のソーステーブル (DWD レイヤー):

    • dwd_user_behavior_ecom_d: E コマースのユーザー行動テーブル。

    • dwd_user_behavior_finance_d: 金融ユーザー行動テーブル。

    • dwd_user_behavior_logistics_d:物流ユーザー行動テーブル。

    • dwd_user_behavior_${business_line}_d:将来、さらにビジネスラインが追加される可能性に対応するユーザー行動テーブル。

    • これらのテーブルはスキーマが同じで、日単位 (dt) でパーティション化されています。

  • 下流のターゲットテーブル (DWS レイヤー):

    • dws_user_summary_d:ユーザー集計テーブル。

    • このテーブルは、すべてのビジネスラインからの集計結果を一元的に保存するために、ビジネスライン(biz_line)と日(dt)で二重にパーティション化されています。

ビジネスラインごとに個別のタスクを作成すると、メンテナンスコストが高くなり、エラーが発生しやすくなります。for-each ノードを使用すると、単一の処理ロジックを維持するだけで、システムが自動的にすべてのビジネスラインを反復処理して計算を完了します。

データ準備

まず、サンプルテーブルを作成し、テストデータを挿入します (業務日 20251010 を例として使用)。

  1. ワークスペースにコンピューティングリソースを関連付けます。

  2. DataStudio に移動してデータ開発を行い、MaxCompute SQL ノードを作成します。

  3. ソーステーブル (DWD レイヤー) の作成:次のコードを MaxCompute SQL ノードに追加して実行します。

    -- eコマースユーザー行動テーブル
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_ecom_d (
        user_id     STRING COMMENT 'ユーザー ID',
        action_type STRING COMMENT 'アクションタイプ',
        event_time  BIGINT COMMENT 'イベントタイムスタンプ (ミリ秒単位の Unix)'
    ) 
    COMMENT 'eコマースユーザー行動ログ詳細テーブル'
    PARTITIONED BY (dt STRING COMMENT '日付パーティション、形式 yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_ecom_d PARTITION (dt='20251010') VALUES
    ('user001', 'click',        1760004060000), -- 2025-10-10 10:01:00.000
    ('user002', 'browse',       1760004150000), -- 2025-10-10 10:02:30.000
    ('user001', 'add_to_cart',  1760004300000); -- 2025-10-10 10:05:00.000
    -- eコマースユーザー行動テーブルが正常に作成されたことを確認します
    SELECT * FROM dwd_user_behavior_ecom_d where dt='20251010';
    -- 金融ユーザー行動テーブル
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_finance_d (
        user_id     STRING COMMENT 'ユーザー ID',
        action_type STRING COMMENT 'アクションタイプ',
        event_time  BIGINT COMMENT 'イベントタイムスタンプ (ミリ秒単位の Unix)'
    ) 
    COMMENT '金融ユーザー行動ログ詳細テーブル'
    PARTITIONED BY (dt STRING COMMENT '日付パーティション、形式 yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_finance_d PARTITION (dt='20251010') VALUES
    ('user003', 'open_app',      1760020200000), -- 2025-10-10 14:30:00.000
    ('user003', 'transfer',      1760020215000), -- 2025-10-10 14:30:15.000
    ('user003', 'check_balance', 1760020245000), -- 2025-10-10 14:30:45.000
    ('user004', 'open_app',      1760020300000); -- 2025-10-10 14:31:40.000
    -- 金融ユーザー行動テーブルが正常に作成されたことを確認します
    SELECT * FROM dwd_user_behavior_finance_d where dt='20251010';
    -- 物流ユーザー行動テーブル
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_logistics_d (
        user_id     STRING COMMENT 'ユーザー ID',
        action_type STRING COMMENT 'アクションタイプ',
        event_time  BIGINT COMMENT 'イベントタイムスタンプ (ミリ秒単位の Unix)'
    ) 
    COMMENT '物流ユーザー行動ログ詳細テーブル'
    PARTITIONED BY (dt STRING COMMENT '日付パーティション、形式 yyyymmdd');
    INSERT OVERWRITE TABLE dwd_user_behavior_logistics_d PARTITION (dt='20251010') VALUES
    ('user001', 'check_status',    1760032800000), -- 2025-10-10 18:00:00.000
    ('user005', 'schedule_pickup', 1760032920000); -- 2025-10-10 18:02:00.000
    -- 物流ユーザー行動テーブルが正常に作成されたことを確認します
    SELECT * FROM dwd_user_behavior_logistics_d where dt='20251010';
  4. ターゲットテーブル (DWS レイヤー) の作成:次のコードを MaxCompute SQL ノードに追加して実行します。

    CREATE TABLE IF NOT EXISTS dws_user_summary_d (
        user_id     STRING COMMENT 'ユーザー ID',
        pv          BIGINT COMMENT '日次アクティビティ数'
    ) 
    COMMENT 'ユーザー日次アクティビティサマリーテーブル'
    PARTITIONED BY (
        dt           STRING COMMENT '日付パーティション、形式 yyyymmdd',
        biz_line     STRING COMMENT 'ビジネスラインパーティション、例:ecom, finance, logistics'
    );
    重要

    ワークスペースが標準モードを使用している場合、このノードを本番環境にデプロイし、データをバックフィルする必要があります。

ワークフローの実装

  1. ワークフローを作成します。右側のスケジューリングパラメータセクションで、スケジューリングパラメータ bizdate に、前日を表す$[yyyymmdd-1]を設定します。

  2. ワークフローで、get_biz_list という名前の割り当てノードを作成し、MaxCompute SQL で次のコードを記述します。このノードは、処理対象のビジネスラインのリストを出力します。

    -- 処理するすべてのビジネスラインを出力
    SELECT 'ecom' AS biz_line
    UNION ALL
    SELECT 'finance' AS biz_line
    UNION ALL
    SELECT 'logistics' AS biz_line;
  3. for-each ノードの設定

    • ワークフローページに戻り、割り当てノード get_biz_list の下流に for-each ノードを作成します。

    • for-each ノード設定ページを開きます。右側の スケジューリング設定 の下にある スケジューリングパラメーター > スクリプトパラメーター セクションで、loopDataArray パラメーターを get_biz_list ノードの outputs にバインドします。

    • for-each ノードのループ本体で、[Create Inner Node] をクリックし、MaxCompute SQL ノードを作成します。ループ本体内に処理ロジックを記述します。

      説明
      • このスクリプトは for-each ノードによって駆動され、ビジネスラインごとに 1 回実行されます。

      • 組み込み変数${dag.foreach.current}は、各反復で現在のビジネスライン名に動的に置き換えられます。期待される反復値は 'ecom'、'finance'、'logistics' です。

      SET odps.sql.allow.dynamic.partition=true;
      INSERT OVERWRITE TABLE dws_user_summary_d PARTITION (dt='${bizdate}', biz_line)
      SELECT
          user_id,
          COUNT(*) AS pv,
          '${dag.foreach.current}' AS biz_line
      FROM
          dwd_user_behavior_${dag.foreach.current}_d
      WHERE
          dt = '${bizdate}'
      GROUP BY
          user_id;
  4. 検証ノードの追加

    ワークフローに戻ります。for-each ノードで [Create Downstream] をクリックして MaxCompute SQL ノードを作成し、次のコードを追加します。

    SELECT * FROM dws_user_summary_d WHERE dt='20251010' ORDER BY biz_line, user_id;

デプロイと結果

ワークフローを本番環境にデプロイします。運用センターの 定期タスクの運用保守 > 定期タスク ページに移動し、対象のワークフローを見つけ、ビジネス日付を '20251010' に設定してスモークテストを実行します。

実行完了後、テストインスタンスで実行ログを表示します。最終ノードの期待される出力は次のとおりです。

user_id

pv

dt

biz_line

user001

2

20251010

ecom

user002

1

20251010

ecom

user003

3

20251010

finance

user004

1

20251010

finance

user001

1

20251010

logistics

user005

1

20251010

logistics

メリット

  • 高いスケーラビリティ:新しいビジネスラインを追加するには、処理ロジックを変更することなく、割り当てノードに SQL を 1 行追加するだけです。

  • 容易なメンテナンス:すべてのビジネスラインが 1 つの処理ロジックを共有します。1 回の変更がすべてに適用されます。

よくある質問

  • Q:MaxCompute SQL モードで、"find no select sql in sql assignment!" というエラーが返されます。

    A: MaxCompute SQL コードに SELECT 文がありません。SELECT 文を追加してください。WITH 構文はサポートされていないため、WITH 文を使用した場合もこのエラーが返されます。

  • Q:シェルまたは Python モードで、"OutPut Result is null, cannot handle!" というエラーが返されます。

    A: 出力がありません。コードに print や echo などの出力ステートメントが含まれているかどうかを確認してください。

  • Q:シェルまたは Python モードで、カンマを含む出力要素をどのように処理しますか?

    A: カンマ (,) をエスケープするには、\, を使用します。次の例では Python を使用します。

    categories = ["Electronics", "Clothing, Shoes & Accessories"]
    # 各要素に含まれるカンマをエスケープ
    # ',' を '\,' に置換
    escaped_categories = [cat.replace(",", "\,") for cat in categories]
    # エスケープされた要素をカンマで結合
    output_string = ",".join(escaped_categories)
    print output_string
    # 最終的に下流に出力される文字列は次のとおりです:
    # Electronics,Clothing\, Shoes & Accessories
  • Q:下流ノードは、複数の上流割り当てノードから結果を受け取ることができますか?

    A:はい。異なるノードの結果を異なるパラメーターに割り当てるだけです。

    image

  • Q:割り当てノードは他の言語タイプをサポートしていますか?

    A:割り当てノードは現在、MaxCompute SQL、Python 2、シェルのみをサポートしています。EMR Hive、Hologres SQL、EMR Spark SQL、AnalyticDB for PostgreSQL、ClickHouse SQL、MySQL などの一部のノードタイプは、ネイティブに割り当てパラメーター機能をサポートしており、同じ効果を実現します。

    [Node Output Parameters] セクションで、[+ Add Assignment Parameter] をクリックします。詳細については、「ノードコンテキストパラメーターの設定と使用」をご参照ください。

関連ドキュメント