All Products
Search
Document Center

DataWorks:Node penetapan

Last Updated:Jun 27, 2026

Node assignment meneruskan hasil kueri atau output lain dari node hulu ke node hilir. Node ini mendukung skrip dalam MaxCompute SQL, Python 2, dan Shell, serta secara otomatis menetapkan hasil kueri atau output terakhir ke parameter output (outputs) miliknya. Node hilir kemudian dapat mereferensikan parameter tersebut untuk mengambil output dari node assignment.

Prasyarat

  • Persyaratan versi: Fitur ini hanya tersedia di DataWorks Standard Edition dan versi yang lebih baru.

  • Izin: Akun RAM Anda harus ditambahkan ke workspace target dan diberi peran Development atau Workspace Manager. Untuk informasi selengkapnya, lihat Tambahkan anggota ke workspace.

Konsep utama: Penyerahan dan referensi parameter

Fungsi inti dari node assignment adalah penyerahan parameter, yang mentransfer data dari node hulu ke node hilir.

  • Node assignment hulu: Menghasilkan data. Node ini secara otomatis menetapkan output atau hasil kueri terakhir ke parameter output yang dihasilkan sistem dengan nama outputs.

  • Node bisnis hilir: Menerima dan menggunakan data tersebut. Anda dapat mengonfigurasi parameter input di node (misalnya, param) dan mengatur nilainya agar mereferensikan parameter outputs dari node hulu. Hal ini memungkinkan data tersebut tersedia bagi kode Anda.

Format parameter

Tabel berikut menjelaskan format parameter yang diteruskan.

Bahasa

Nilai

Format

MaxCompute SQL

Output dari pernyataan SELECT terakhir.

Node meneruskan output ke node hilir sebagai array dua dimensi.

Python 2

Output dari pernyataan print terakhir.

DataWorks memisahkan string output berdasarkan koma (,) menjadi array satu dimensi.

Misalnya, jika baris output terakhir dari node assignment adalah 'Electronics,Clothing,Books', nilai yang diteruskan ke node hilir adalah ['Electronics','Clothing','Books'].
Penting

Jika output berisi koma, Anda harus melakukan escape terhadapnya. Misalnya, jika output adalah 'Electronics,Clothing\, Shoes & Accessories', node hilir akan menguraikannya dengan benar sebagai ['Electronics', 'Clothing, Shoes & Accessories'].

Shell

Output dari pernyataan echo terakhir.

Prosedur

Contoh berikut menunjukkan cara meneruskan hasil node assignment ke node Shell. Dalam praktiknya, Anda dapat menggunakan jenis node apa pun sebagai node hilir.

  1. Konfigurasikan node assignment hulu

    Di workflow target, buat dan edit node assignment. Pilih MaxCompute SQL, Python 2, atau Shell sesuai kebutuhan, lalu tulis kode untuk menghasilkan hasil yang ingin Anda teruskan ke node hilir.

    print '10,20,30,40'
  2. Konfigurasikan node Shell hilir

    Buat node Shell dan referensikan hasil hulu dalam konfigurasi node:

    1. Di panel Scheduling Settings di sebelah kanan, klik tab Node Context Parameters.

    2. Di bagian Input Parameters, klik Add parameters.

    3. Di kotak dialog yang muncul, atur nilainya ke parameter outputs dari node assignment yang telah Anda buat. Tentukan Parameter Name kustom untuk parameter input node saat ini (misalnya, param).

      Catatan

      Setelah Anda mengonfigurasi parameter, dependensi secara otomatis dibuat antara node hilir dan node assignment hulu.

    4. Setelah mengonfigurasi parameter, Anda dapat menggunakan format ${param} dalam kode node Shell hilir untuk mereferensikan nilai yang diteruskan dari node hulu.

  3. Jalankan dan verifikasi

    1. Kembali ke kanvas workflow. Di bilah alat, klik Deploy dan pilih Full Deployment.

    2. Buka Node O&M > Auto Triggered Task O&M > Auto Triggered Task dan jalankan smoke test pada workflow target.

    3. Di instans pengujian, periksa apakah hasil akhir sesuai harapan.

Buat node assignment menggunakan OpenAPI

Selain menggunakan konsol, Anda dapat membuat node assignment dengan memanggil operasi DataWorks OpenAPI CreateNode. Saat membuat node melalui API, Anda harus mengonfigurasi informasi node dalam parameter Spec FlowSpec.

Untuk bind resource group, tentukan identifier resource group di field runtimeResource.resourceGroup dalam FlowSpec. Kode berikut memberikan contohnya:

{
  "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"
      }
    ]
  }
}

Jika Anda menggunakan kode kustom untuk memanggil API, pastikan parameter diteruskan dengan cara yang sama seperti SDK resmi Alibaba Cloud. Jika tidak, bind resource group mungkin gagal berlaku meskipun parameter diteruskan dengan benar.

Batasan

  • Tingkat penerusan: Node assignment hanya dapat meneruskan parameter ke node anak hilir langsungnya, tidak lintas beberapa tingkat.

  • Batas ukuran: Ukuran nilai maksimum adalah 2 MB. Jika output pernyataan assignment melebihi batas ini, node assignment akan gagal.

  • Batasan sintaksis:

    • Komentar tidak didukung dalam kode node assignment. Menyertakan komentar dapat menyebabkan hasil yang tidak diharapkan.

    • Klausa WITH tidak didukung dalam mode MaxCompute SQL.

Contoh berdasarkan bahasa

Format data output (outputs) dan cara node hilir mereferensikannya sedikit berbeda tergantung bahasa node assignment. Contoh berikut menggunakan node Shell sebagai node hilir untuk mengilustrasikan perbedaan tersebut.

Contoh 1: Teruskan hasil kueri MaxCompute SQL

Hasil kueri SQL diteruskan ke node hilir sebagai array dua dimensi.

  • Konfigurasi node hulu (node assignment - SQL)

    Asumsikan kode SQL berikut mengembalikan dua baris dan dua kolom:

    SELECT 'beijing', '1001'
    UNION ALL 
    SELECT 'hangzhou', '1002';
  • Konfigurasi dan output node hilir (node Shell)

    Di node Shell, tambahkan parameter input bernama region yang mereferensikan outputs dari node SQL hulu.

    Tulis kode berikut untuk membaca data:

    echo "Full result set: ${region}"
    echo "First row: ${region[0]}"
    echo "Second field of the first row: ${region[0][1]}"

    DataWorks langsung mengurai parameter dan melakukan penggantian statis. Output waktu proses adalah sebagai berikut:

    Full result set: beijing,1001
    hangzhou,1002
    First row: beijing,1001
    Second field of the first row: 1001

Contoh 2: Teruskan hasil output Python 2

Output pernyataan print Python 2 dipisahkan berdasarkan koma (,) dan diteruskan ke node hilir sebagai array satu dimensi.

  • Konfigurasi node hulu (node assignment - Python 2)

    Kode Python 2 adalah sebagai berikut:

    print 'Electronics, Clothing, Books';
  • Konfigurasi dan output node hilir (node Shell)

    Di node Shell, tambahkan parameter input bernama types yang mereferensikan outputs dari node assignment hulu.

    Tulis kode berikut untuk membaca data:

    # Print the entire one-dimensional array
    echo "Full result set: ${types}"
    
    # Print an element from the array by index
    echo "Second element: ${types[1]}"

    DataWorks langsung mengurai parameter dan melakukan penggantian statis. Output waktu proses adalah sebagai berikut:

    Full result set: Electronics,Clothing,Books
    Second element: Clothing
Catatan

Logika pemrosesan untuk node Shell mirip dengan node Python 2 dan tidak diulang di sini.

Kasus penggunaan: Pemrosesan batch data terpartisi

Contoh ini menunjukkan cara menggunakan node assignment dan node for-each untuk memproses batch data perilaku pengguna dari beberapa lini bisnis. Hal ini memungkinkan Anda menerapkan pemrosesan data otomatis untuk beberapa lini produk dengan satu set logika saja.

Latar belakang

Asumsikan Anda adalah insinyur data di perusahaan internet besar yang bertanggung jawab memproses data dari tiga lini bisnis inti: e-dagang (ecom), keuangan (finance), dan logistik (logistics). Lebih banyak lini bisnis mungkin ditambahkan di masa depan. Anda perlu menjalankan logika agregasi harian yang sama pada log perilaku pengguna untuk lini bisnis ini guna menghitung PV (page view) untuk setiap pengguna dan menyimpan hasilnya di tabel ringkasan terpadu.

  • Tabel sumber hulu (lapisan DWD):

    • dwd_user_behavior_ecom_d: Tabel perilaku pengguna e-dagang.

    • dwd_user_behavior_finance_d: Tabel perilaku pengguna keuangan.

    • dwd_user_behavior_logistics_d: Tabel perilaku pengguna logistik.

    • dwd_user_behavior_${biz_line}_d: Tabel perilaku pengguna untuk lini bisnis potensial lainnya.

    • Tabel-tabel ini memiliki struktur yang sama dan dipartisi berdasarkan hari (dt).

  • Tabel target hilir (lapisan DWS):

    • dws_user_summary_d: Tabel ringkasan pengguna.

    • Tabel ini dipartisi berdasarkan lini bisnis (biz_line) dan hari (dt) untuk menyimpan hasil agregasi dari semua lini bisnis.

Membuat tugas terpisah untuk setiap lini bisnis sulit dipelihara dan rentan kesalahan. Menggunakan node for-each menyederhanakan pemeliharaan karena Anda hanya perlu memelihara satu set logika pemrosesan, dan sistem secara otomatis melakukan iterasi melalui semua lini bisnis untuk menyelesaikan perhitungan.

Persiapan data

Pertama, buat tabel sampel dan masukkan data uji. Contoh ini menggunakan tanggal bisnis 20251010.

  1. Bind compute engine MaxCompute ke workspace.

  2. Buka Data Studio dan buat node MaxCompute SQL.

  3. Buat tabel sumber (lapisan DWD): Tambahkan kode berikut ke node MaxCompute SQL, pilih, lalu jalankan.

    -- Tabel perilaku pengguna e-dagang
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_ecom_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'UNIX timestamp of the event in milliseconds'
    ) 
    COMMENT 'Detailed e-commerce user behavior log table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format 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
    -- Verifikasi bahwa tabel perilaku pengguna e-dagang telah dibuat.
    SELECT * FROM dwd_user_behavior_ecom_d where dt='20251010';
    -- Tabel perilaku pengguna keuangan
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_finance_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'UNIX timestamp of the event in milliseconds'
    ) 
    COMMENT 'Detailed finance user behavior log table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format 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
    -- Verifikasi bahwa tabel perilaku pengguna keuangan telah dibuat.
    SELECT * FROM dwd_user_behavior_finance_d where dt='20251010';
    -- Tabel perilaku pengguna logistik
    CREATE TABLE IF NOT EXISTS dwd_user_behavior_logistics_d (
        user_id     STRING COMMENT 'User ID',
        action_type STRING COMMENT 'Action type',
        event_time  BIGINT COMMENT 'UNIX timestamp of the event in milliseconds'
    ) 
    COMMENT 'Detailed logistics user behavior log table'
    PARTITIONED BY (dt STRING COMMENT 'Date partition, format 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
    -- Verifikasi bahwa tabel perilaku pengguna logistik telah dibuat.
    SELECT * FROM dwd_user_behavior_logistics_d where dt='20251010';
  4. Buat tabel target (lapisan DWS): Tambahkan kode berikut ke node MaxCompute SQL, pilih, lalu jalankan.

    CREATE TABLE IF NOT EXISTS dws_user_summary_d (
        user_id     STRING COMMENT 'User ID',
        pv          BIGINT COMMENT 'PV'
    ) 
    COMMENT 'User daily PV summary table'
    PARTITIONED BY (
        dt           STRING COMMENT 'Date partition, format yyyymmdd',
        biz_line     STRING COMMENT 'Business line partition, such as ecom, finance, logistics'
    );
    Penting

    Jika workspace berada di Standard Edition, Anda harus deploy node ini ke lingkungan produksi dan lakukan pengisian ulang data.

Implementasi workflow

  1. Buat workflow. Di panel Scheduling Parameters di sebelah kanan, atur scheduling parameter bizdate ke hari sebelumnya: $[yyyymmdd-1].

  2. Di workflow, buat node assignment bernama get_biz_list dan gunakan bahasa MaxCompute SQL untuk menulis kode berikut. Node ini mengeluarkan daftar lini bisnis yang akan diproses:

    -- Output all business lines to be processed
    SELECT 'ecom' AS biz_line
    UNION ALL
    SELECT 'finance' AS biz_line
    UNION ALL
    SELECT 'logistics' AS biz_line;
  3. Konfigurasikan node for-each

    • Kembali ke kanvas workflow dan buat node for-each hilir untuk node assignment get_biz_list.

    • Buka halaman pengaturan node for-each. Di panel scheduling configuration di sebelah kanan, di bawah Scheduling Parameters > Script Parameters, bind parameter loopDataArray ke outputs dari node get_biz_list.

    • Di badan loop node for-each, klik Create Internal Node untuk membuat node MaxCompute SQL, lalu tulis logika pemrosesan untuk badan loop.

      Catatan
      • Skrip ini dikendalikan oleh node for-each dan dijalankan sekali untuk setiap lini bisnis.

      • Saat waktu proses, variabel bawaan ${dag.foreach.current} diganti secara dinamis dengan nama lini bisnis saat ini. Nilai iterasi yang diharapkan adalah 'ecom', 'finance', dan '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. Tambahkan node verifikasi

    Kembali ke workflow. Klik Create Downstream Node untuk node for-each guna membuat node MaxCompute SQL dan tambahkan kode berikut.

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

Penyebaran dan hasil

Deploy workflow ke lingkungan produksi. Buka Auto Triggered Task O&M > Auto Triggered Task, temukan workflow target, lalu jalankan smoke test dengan tanggal bisnis diatur ke '20251010'.

Setelah eksekusi selesai, lihat log eksekusi di instans pengujian. Node terakhir harus menghasilkan output berikut:

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

Keunggulan

  • Skalabilitas tinggi: Untuk menambahkan lini bisnis baru, Anda hanya perlu menambahkan satu baris SQL ke node assignment. Logika pemrosesan tidak perlu diubah.

  • Pemeliharaan mudah: Semua lini bisnis berbagi logika pemrosesan yang sama. Perubahan di satu tempat berlaku untuk semuanya.

FAQ

  • T: Mengapa saya mendapatkan error "find no select sql in sql assignment!" saat menggunakan MaxCompute SQL?

    J: Error ini terjadi karena skrip MaxCompute SQL tidak memiliki pernyataan SELECT. Tambahkan pernyataan SELECT untuk mengatasi masalah ini. Perhatikan bahwa klausa WITH tidak didukung, dan penggunaannya juga akan memicu error ini.

  • T: Mengapa saya mendapatkan error "OutPut Result is null, cannot handle!" saat menggunakan Shell atau Python?

    J: Error ini menunjukkan bahwa skrip tidak menghasilkan output. Pastikan kode Anda mencakup pernyataan output, seperti print untuk Python atau echo untuk Shell.

  • T: Bagaimana cara menangani elemen output yang berisi koma di Shell atau Python?

    J: Anda harus melakukan escape terhadap koma (,) dengan menggantinya menjadi \,. Kode Python berikut memberikan contohnya.

    categories = ["Electronics", "Clothing, Shoes & Accessories"]
    # Escape the comma in each element.
    # Replace ',' with '\,'.
    escaped_categories = [cat.replace(",", "\,") for cat in categories]
    # Join the escaped elements with a comma.
    output_string = ",".join(escaped_categories)
    print output_string
    # The final string passed to the downstream node is:
    # Electronics,Clothing\, Shoes & Accessories
  • T: Apakah node hilir dapat menerima hasil dari beberapa node assignment hulu?

    J: Ya. Anda dapat menetapkan hasil dari node berbeda ke parameter berbeda.

    image

  • T: Apakah node assignment mendukung jenis bahasa lain?

    J: Node assignment saat ini hanya mendukung MaxCompute SQL, Python 2, dan Shell. Namun, beberapa jenis node lain, seperti EMR Hive, Hologres SQL, EMR Spark SQL, AnalyticDB for PostgreSQL, ClickHouse SQL, dan MySQL, memiliki fitur bawaan parameter assignment yang mencapai hasil yang sama.

    Di bagian Output Parameters, klik Add Assignment Parameter.

Topik terkait