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âmetrooutputsdo nó upstream. Isso torna os dados disponíveis para o seu código.
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 | O nó passa a saída para os nós downstream como um array bidimensional. |
Python 2 | Saída da última instrução | O DataWorks divide a string de saída por vírgulas ( Por exemplo, se a última linha do nó de atribuição gerar Importante Se a própria saída contiver vírgulas, escape-as. Por exemplo, se a saída for |
Shell | Saída da última instrução |
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.
-
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' -
Configure o nó Shell downstream
Crie um nó Shell. Na página de edição do nó Shell, referencie o resultado upstream:
No painel Scheduling Settings à direita, selecione a aba Node Context Parameters.
Na seção Input Parameters, clique em Add parameters.
-
Na caixa de diálogo exibida, defina o parâmetro de saída do nó upstream como o parâmetro
outputsdo 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).NotaApós a configuração, o nó downstream estabelece automaticamente uma dependência do nó de atribuição upstream.
Com o parâmetro configurado, utilize o valor passado do nó upstream no código do nó Shell downstream usando o formato
${param}.
-
Verifique o resultado
Retorne ao workflow e clique em Deploy na barra de ferramentas. Selecione a implantação completa.
Acesse a página no Operation Center e realize testes de fumaça.
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
regione referencie o parâmetrooutputsdo 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
typese referencie o parâmetrooutputsdo 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
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.
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):
Associe um recurso de computação ao workspace.
Acesse o Data Studio para desenvolvimento de dados e crie um nó MaxCompute SQL.
-
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'; -
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' );ImportanteSe 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
Crie um workflow. Na seção Scheduling Parameters à direita, defina o parâmetro de agendamento bizdate para o dia anterior:
$[yyyymmdd-1].-
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; -
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 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.
NotaEste 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;
-
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 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
SELECTno código MaxCompute SQL. Adicione uma instruçãoSELECT. 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 (
printouecho). -
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.

-
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
Se o nó downstream precisar iterar e processar dados em loop, consulte Nó Do-while e Nó For-each.
Caso precise passar parâmetros entre níveis, consulte Nó virtual.
Para mais informações sobre a configuração de passagem de parâmetros, consulte Parâmetros de contexto do nó.