Todos os produtos
Search
Central de documentação

DataWorks:Nó de atribuição

Última atualização: Jun 30, 2026

Use um nó de atribuição para passar resultados de consultas ou outras saídas de um nó upstream para um nó downstream. O nó de atribuição (que atua como nó upstream) aceita scripts em MaxCompute SQL, Python 2 e Shell. Ele atribui automaticamente o resultado da última consulta ou saída ao parâmetro de saída do nó (outputs). Os nós downstream podem referenciar esse parâmetro para obter a saída do nó de atribuição.

Observações de uso

  • Requisitos de versão: Este recurso está disponível apenas no DataWorks Standard Edition e em versões posteriores.

  • Permissões: Adicione sua conta RAM ao workspace de destino e atribua a ela a função de developer ou workspace administrator. Para mais informações, consulte Adicionar membros a um workspace.

Conceitos principais: passagem e referência de parâmetros

A função principal de um nó de atribuição é a passagem de parâmetros, que transfere dados de um nó upstream para um nó downstream.

  • Nó de atribuição upstream: Gera os dados e atribui automaticamente a última saída ou resultado de consulta a um parâmetro de saída gerado pelo sistema chamado outputs.

  • Nó de negócio downstream: Recebe e utiliza os dados. Configure um parâmetro de entrada no nó (por exemplo, param) e defina seu valor para referenciar o parâmetro outputs do nó upstream. Isso torna os dados disponíveis para o seu código.

    image

Formato dos parâmetros

A tabela a seguir descreve o formato dos parâmetros passados.

Linguagem

Valor

Formato

MaxCompute SQL

Saída da última instrução SELECT.

O nó passa a saída para os nós downstream como um array bidimensional.

Python 2

Saída da última instrução print.

O DataWorks divide a string de saída por vírgulas (,) em um array unidimensional.

Por exemplo, se a última linha do nó de atribuição gerar 'Electronics,Clothing,Books', o valor passado para os nós downstream será ['Electronics','Clothing','Books'].
Importante

Se a própria saída contiver vírgulas, escape-as. Por exemplo, se a saída for 'Electronics,Clothing\, Shoes & Accessories', o nó downstream a analisará corretamente como ['Electronics', 'Clothing, Shoes & Accessories'].

Shell

Saída da última instrução echo.

Procedimento

O exemplo a seguir demonstra o procedimento geral para passar o resultado de um nó de atribuição para um nó Shell. Na prática, qualquer tipo de nó pode atuar como nó downstream.

  1. Configure o nó de atribuição upstream

    No workflow de destino, crie e edite um nó de atribuição. Selecione MaxCompute SQL, Python 2 ou Shell conforme necessário e escreva o código para produzir o resultado desejado para o nó downstream.

    print '10,20,30,40'
  2. Configure o nó Shell downstream

    Crie um nó Shell. Na página de edição do nó Shell, referencie o resultado upstream:

    1. No painel Scheduling Settings à direita, selecione a aba Node Context Parameters.

    2. Na seção Input Parameters, clique em Add parameters.

    3. Na caixa de diálogo exibida, defina o parâmetro de saída do nó upstream como o parâmetro outputs do nó de atribuição configurado na etapa anterior. Especifique um Parameter Name personalizado para o parâmetro de entrada do nó atual (por exemplo, param).

      Nota

      Após a configuração, o nó downstream estabelece automaticamente uma dependência do nó de atribuição upstream.

    4. Com o parâmetro configurado, utilize o valor passado do nó upstream no código do nó Shell downstream usando o formato ${param}.

  3. Verifique o resultado

    1. Retorne ao workflow e clique em Deploy na barra de ferramentas. Selecione a implantação completa.

    2. Acesse a página Node O&M > Auto Triggered Task O&M > Auto Triggered Task no Operation Center e realize testes de fumaça.

    3. Na instância de teste, verifique se o resultado final atende às expectativas.

Criar um nó de atribuição usando OpenAPI

Além do console, crie um nó de atribuição chamando a operação CreateNode da OpenAPI do DataWorks. Ao criar um nó via API, configure as informações do nó no parâmetro Spec do FlowSpec.

Para associar um grupo de recursos, especifique o identificador do grupo de recursos no campo runtimeResource.resourceGroup no FlowSpec. Exemplo:

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

Ao usar código personalizado para chamar a API, garanta que os parâmetros sigam o mesmo padrão do SDK oficial da Alibaba Cloud. Caso contrário, os parâmetros podem ser transmitidos, mas a associação do grupo de recursos pode não ter efeito.

Observações

  • Hierarquia de passagem: Os parâmetros de um nó de atribuição só podem ser passados para seus nós filhos downstream imediatos. Não há suporte para passagem de parâmetros entre níveis não adjacentes.

  • Limite de tamanho: O tamanho máximo do valor passado é de 2 MB. Se a saída da instrução de atribuição exceder esse limite, o nó de atribuição falhará.

  • Restrições de sintaxe:

    • Não há suporte para comentários no código de um nó de atribuição. Adicionar comentários pode causar resultados inesperados.

    • A sintaxe WITH não tem suporte no modo MaxCompute SQL.

Exemplos: Explicação detalhada por linguagem

O formato de dados da saída (outputs) e a forma como os nós downstream a referenciam variam ligeiramente dependendo da linguagem do nó de atribuição. Os exemplos a seguir utilizam um nó Shell como nó downstream.

Exemplo 1: Passar resultados de consulta MaxCompute SQL

Os resultados de consultas SQL são passados para os nós downstream como um array bidimensional.

  • Configuração do nó upstream (nó de atribuição - SQL)

    Considere o seguinte código SQL, cuja consulta retorna duas linhas e duas colunas de dados:

    SELECT 'beijing', '1001'
    UNION ALL 
    SELECT 'hangzhou', '1002';
  • Configuração e saída do nó downstream (nó Shell)

    No nó Shell, adicione um parâmetro de entrada chamado region e referencie o parâmetro outputs do nó SQL upstream.

    Escreva o seguinte código para ler os dados:

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

    O DataWorks analisa diretamente o parâmetro e realiza a substituição estática. A saída é a seguinte:

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

Exemplo 2: Passar resultados de saída Python 2

A saída da instrução print do Python 2 é dividida por vírgulas (,) e passada para os nós downstream como um array unidimensional.

  • Configuração do nó upstream (nó de atribuição - Python 2)

    O código Python 2 é o seguinte:

    print 'Electronics, Clothing, Books';
  • Configuração e saída do nó downstream (nó Shell)

    No nó Shell, adicione um parâmetro de entrada chamado types e referencie o parâmetro outputs do nó de atribuição upstream.

    Escreva o seguinte código para ler os dados:

    # Directly output the entire one-dimensional array
    echo "Entire result set: ${types}"
    
    # Output elements by index
    echo "Second element: ${types[1]}"

    O DataWorks analisa diretamente o parâmetro e realiza a substituição estática. A saída é a seguinte:

    Entire result set: Electronics,Clothing,Books
        Second element: Clothing
Nota

A lógica de processamento para nós Shell é semelhante à do Python 2, portanto não será repetida aqui.

Cenário: Processamento em lote de dados de tabelas particionadas em várias linhas de negócio

Este exemplo demonstra como usar um nó de atribuição e um nó for-each para processar em lote dados de comportamento do usuário em várias linhas de negócio. Essa abordagem permite o processamento automatizado de dados com um único conjunto de lógica de processamento que atende a múltiplas linhas de produtos.

image

Contexto

Suponha que você seja um engenheiro de desenvolvimento de dados em uma empresa abrangente de internet e responda pelo processamento de dados de três linhas de negócio principais: e-commerce (ecom), finanças (finance) e logística (logistics), com a possibilidade de adicionar mais linhas de negócio no futuro. Execute a mesma lógica de agregação nos logs de comportamento do usuário dessas três linhas de negócio diariamente para calcular as visualizações diárias de página (PV) por usuário e armazenar os resultados em uma tabela agregada unificada.

  • Tabelas de origem upstream (camada DWD):

    • dwd_user_behavior_ecom_d: Tabela de comportamento do usuário de e-commerce.

    • dwd_user_behavior_finance_d: Tabela de comportamento do usuário de finanças.

    • dwd_user_behavior_logistics_d: Tabela de comportamento do usuário de logística.

    • dwd_user_behavior_${business_line}_d: Tabelas de comportamento do usuário para possíveis linhas de negócio futuras.

    • Essas tabelas possuem o mesmo esquema e são particionadas por dia (dt).

  • Tabela de destino downstream (camada DWS):

    • dws_user_summary_d: Tabela agregada de usuários.

    • Esta tabela possui partição dupla por linha de negócio (biz_line) e dia (dt) para armazenar os resultados agregados de todas as linhas de negócio de maneira unificada.

Criar uma tarefa separada para cada linha de negócio resulta em altos custos de manutenção e propensão a erros. Ao usar um nó for-each, mantenha apenas um único conjunto de lógica de processamento, e o sistema itera automaticamente por todas as linhas de negócio para concluir o cálculo.

Preparação dos dados

Primeiro, crie as tabelas de exemplo e insira dados de teste (usando a data de negócio 20251010 como exemplo):

  1. Associe um recurso de computação ao workspace.

  2. Acesse o Data Studio para desenvolvimento de dados e crie um nó MaxCompute SQL.

  3. Crie as tabelas de origem (camada DWD): Adicione o seguinte código ao nó MaxCompute SQL e execute-o.

    -- E-commerce user behavior table
    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 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'E-commerce user behavior log detail 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
    -- Verify e-commerce user behavior table created successfully
    SELECT * FROM dwd_user_behavior_ecom_d where dt='20251010';
    -- Finance user behavior table
    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 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'Finance user behavior log detail 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
    -- Verify finance user behavior table created successfully
    SELECT * FROM dwd_user_behavior_finance_d where dt='20251010';
    -- Logistics user behavior table
    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 'Event timestamp in milliseconds (Unix)'
    ) 
    COMMENT 'Logistics user behavior log detail 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
    -- Verify logistics user behavior table created successfully
    SELECT * FROM dwd_user_behavior_logistics_d where dt='20251010';
  4. Crie a tabela de destino (camada DWS): Adicione o seguinte código ao nó MaxCompute SQL e execute-o.

    CREATE TABLE IF NOT EXISTS dws_user_summary_d (
        user_id     STRING COMMENT 'User ID',
        pv          BIGINT COMMENT 'Daily activity count'
    ) 
    COMMENT 'User daily activity summary table'
    PARTITIONED BY (
        dt           STRING COMMENT 'Date partition, format yyyymmdd',
        biz_line     STRING COMMENT 'Business line partition, e.g. ecom, finance, logistics'
    );
    Importante

    Se o workspace usar o modo padrão, implante este nó no ambiente de produção e faça o backfill dos dados.

Implementação do workflow

  1. Crie um workflow. Na seção Scheduling Parameters à direita, defina o parâmetro de agendamento bizdate para o dia anterior: $[yyyymmdd-1].

  2. No workflow, crie um nó de atribuição chamado get_biz_list e escreva o seguinte código em MaxCompute SQL. Este nó gera a lista de linhas de negócio a serem processadas:

    -- 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. Configure o nó for-each

    • Retorne à página do workflow e crie um nó for-each downstream para o nó de atribuição get_biz_list.

    • Abra a página de configurações do nó for-each. Na seção Scheduling Parameters > Script Parameters dentro de schedule settings à direita, vincule o parâmetro loopDataArray aos outputs do nó get_biz_list.

    • No corpo do loop do nó for-each, clique em Create Internal Node e crie um nó MaxCompute SQL. Escreva a lógica de processamento dentro do corpo do loop.

      Nota
      • Este script é impulsionado pelo nó for-each e executado uma vez para cada linha de negócio.

      • A variável interna ${dag.foreach.current} é substituída dinamicamente pelo nome da linha de negócio atual em cada iteração. Os valores de iteração esperados são: '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. Adicione um nó de verificação

    Retorne ao workflow. Clique em Create Downstream no nó for-each para criar um nó MaxCompute SQL e adicione o seguinte código.

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

Implantação e resultados

Faça o Deploy do workflow para o ambiente de produção. Acesse a página Auto Triggered Task O&M > Auto Triggered Task no Operation Center. Localize o workflow de destino e realize testes de fumaça com a data de negócio definida como '20251010'.

Após a conclusão da execução, visualize o log de tempo de execução na instância de teste. A saída esperada do nó final é a seguinte:

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

Vantagens

  • Alta escalabilidade: Ao adicionar uma nova linha de negócio, basta inserir uma linha de SQL no nó de atribuição, sem modificar a lógica de processamento.

  • Facilidade de manutenção: Todas as linhas de negócio compartilham o mesmo conjunto de lógica de processamento. Uma única modificação se aplica a todas as linhas de negócio.

Perguntas frequentes

  • P: No modo MaxCompute SQL, o erro "find no select sql in sql assignment!" é retornado.

    R: Falta uma instrução SELECT no código MaxCompute SQL. Adicione uma instrução SELECT. A sintaxe WITH não tem suporte. Se você usar uma instrução WITH, esse erro também será retornado.

  • P: No modo Shell ou Python, o erro "OutPut Result is null, cannot handle!" é retornado.

    R: A saída está ausente. Verifique se o código contém uma instrução de impressão (print ou echo).

  • P: No modo Shell ou Python, como lidar com elementos de saída que contêm vírgulas?

    R: Escape as vírgulas (,) usando \,. O exemplo a seguir usa Python:

    categories = ["Electronics", "Clothing, Shoes & Accessories"]
    # Escape commas contained in each element
    # Replace ',' with '\,'
    escaped_categories = [cat.replace(",", "\,") for cat in categories]
    # Join escaped elements with commas
    output_string = ",".join(escaped_categories)
    print output_string
    # The final string output to downstream is:
    # Electronics,Clothing\, Shoes & Accessories
  • P: Um nó downstream pode receber resultados de vários nós de atribuição upstream?

    R: Sim. Basta atribuir os resultados de diferentes nós a parâmetros diferentes.

    image

  • P: O nó de atribuição suporta outros tipos de linguagem?

    R: Atualmente, o nó de atribuição suporta apenas MaxCompute SQL, Python 2 e Shell. Alguns tipos de nó, como EMR Hive, Hologres SQL, EMR Spark SQL, AnalyticDB for PostgreSQL, ClickHouse SQL e nós MySQL, suportam nativamente o recurso de parâmetro de atribuição, que alcança o mesmo efeito que um nó de atribuição.

    Na seção Node Output Parameters, clique em + Add Assignment Parameter.

Referências