Todos os produtos
Search
Central de documentação

MaxCompute:Desenvolver uma tarefa PyODPS 2

Última atualização: Jul 05, 2026

Os nós PyODPS 2 permitem escrever código Python diretamente no DataWorks para processar dados do MaxCompute usando o SDK Python PyODPS.

Pré-requisitos

Antes de começar, verifique se você possui:

Como funciona

O PyODPS é o SDK Python para o MaxCompute. No DataWorks, cada nó PyODPS inclui uma variável global pré-injetada odps (também referenciada como o) que serve como ponto de entrada do MaxCompute. Você escreve código Python usando esse ponto de entrada para consultar tabelas, executar instruções SQL, gerenciar recursos e processar dados. O DataWorks também injeta um dicionário global args para que seu código possa ler parâmetros de agendamento em tempo de execução.

A única diferença entre os nós PyODPS 2 e PyODPS 3 reside na camada Python: o PyODPS 2 utiliza Python 2.7, enquanto o PyODPS 3 utiliza Python 3.

Limites

Restrição

Detalhes

Versão do Python

2.7

Processamento local de dados (grupo de recursos exclusivo)

Mantenha abaixo de 50 MB. Exceder esse limite pode causar um erro de falta de memória (OOM) e encerrar o processo com a mensagem Got killed

CUs (grupo de recursos serverless)

Até 64 CUs por tarefa; mantenha-se dentro de 16 CUs para evitar escassez de recursos na inicialização

Tarefas Python simultâneas

Uma tarefa por vez por nó

Tamanho do log de saída

Até 4 MB

Pacotes de terceiros com código binário

Não suportado

Bibliotecas pré-instaladas

NumPy e pandas (utilizáveis fora de funções definidas pelo usuário (UDFs))

InstanceTunnel

Desativado por padrão; defina options.tunnel.use_instance_tunnel = True para ativar globalmente

O limite de memória de 50 MB aplica-se apenas a operações locais de dados. Tarefas SQL e DataFrame (exceto to_pandas ) iniciadas pelo PyODPS não estão sujeitas a essa restrição.

Observações de uso

Pacotes de terceiros

Para utilizar um pacote de terceiros em um nó PyODPS, use um grupo de recursos serverless e crie uma imagem personalizada que inclua o pacote.

Caso seu código UDF necessite de um pacote de terceiros, a abordagem de imagem personalizada não se aplica. Consulte Exemplo: Referenciar pacotes de terceiros em UDFs Python .

Acesso à rede

Para acessar uma source de dados em uma VPC ou em um data center on-premises, execute o nó em um grupo de recursos serverless e estabeleça uma conexão de rede entre o grupo de recursos e a source de dados. Consulte Soluções de conectividade de rede.

Atualização do PyODPS

  • Em um grupo de recursos serverless: utilize o recurso de gerenciamento de imagens para executar /home/tops/bin/pip3 install pyodps==0.12.1 em um nó PyODPS 3 (substitua 0.12.1 pela versão desejada). Consulte Gerenciar imagens.

  • Em um grupo de recursos exclusivo para agendamento: utilize o recurso O&M Assistant para executar o mesmo comando em um nó PyODPS 3. Consulte Usar o recurso O&M Assistant.

Logs de saída

Mantenha a saída de logs enxuta. Inclua logs de alerta e pontos de verificação de progresso em vez de despejar grandes conjuntos de dados no log. O limite de 4 MB aplica-se a todo o log de saída de uma execução de nó.

Linhagem de dados

Se as instruções SQL em um nó PyODPS não gerarem linhagens de dados no Data Map, passe os parâmetros de tempo de execução do agendador do DataWorks como hints SQL. O código a seguir demonstra como coletar esses parâmetros e passá-los durante a execução do SQL:

import os

# Collect DataWorks scheduler runtime parameters
skynet_hints = {}
for k, v in os.environ.items():
    if k.startswith('SKYNET_'):
        skynet_hints[k] = v

# Pass the parameters as hints when running SQL
o.execute_sql('INSERT OVERWRITE TABLE XXXX SELECT * FROM YYYY WHERE ***', hints=skynet_hints)

Para mais informações, consulte Visualizar linhagens de dados e Configurar o parâmetro hints.

Escrever e executar código

Para obter a referência completa da sintaxe PyODPS, consulte Visão geral.

Usar o ponto de entrada do MaxCompute

Todo nó PyODPS pré-injeta odps (e seu alias o) como o ponto de entrada do MaxCompute. Não é necessário inicializar um cliente manualmente.

print(odps.exist_table('PyODPS_iris'))

Executar instruções SQL

Utilize o.execute_sql() para executar instruções SQL no MaxCompute.

Por padrão, o InstanceTunnel está desativado. Ao ler resultados com instance.open_reader, a interface Result limita a leitura a 10.000 registros. Para ler todos os registros, ative o InstanceTunnel globalmente:

options.tunnel.use_instance_tunnel = True
options.tunnel.limit_instance_tunnel = False  # Remove the record count limit

with instance.open_reader() as reader:
    # Reads all records using InstanceTunnel

Para ativar o InstanceTunnel em uma única operação de leitura sem alterar a configuração global:

with instance.open_reader(tunnel=True, limit=False) as reader:
    # Reads all records for this operation only

Ler resultados de consultas SQL

Use open_reader para processar os resultados da consulta.

Para instruções SQL que retornam dados estruturados:

with o.execute_sql('select * from dual').open_reader() as reader:
    for record in reader:  # Process each record
        ...

Para instruções DDL, como DESC, utilize reader.raw para obter a saída bruta:

with o.execute_sql('desc dual').open_reader() as reader:
    print(reader.raw)

Configurar parâmetros de tempo de execução

Passe configurações de tempo de execução para a execução SQL usando o parâmetro hints (um dicionário):

o.execute_sql('select * from PyODPS_iris', hints={'odps.sql.mapper.split.size': 16})

Para aplicar configurações globalmente em todas as execuções SQL no nó:

from odps import options
options.sql.settings = {'odps.sql.mapper.split.size': 16}
o.execute_sql('select * from PyODPS_iris')  # Uses the global settings

Para mais informações sobre os hints suportados, consulte Operações SET.

Usar DataFrame para processar dados

O uso de DataFrame não é recomendado. Considere utilizar SQL ou outras abordagens suportadas.

As operações da API DataFrame são lazy — elas executam apenas quando você chama um método de execução imediata.

from odps.df import DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))
for record in iris[iris.sepal_width < 3].execute():  # Triggers execution
    ...

Para habilitar a execução implícita em métodos de exibição, defina options.interactive como True no início do nó:

from odps import options
from odps.df import DataFrame
options.interactive = True  # Enable at the top of the node
iris = DataFrame(o.get_table('pyodps_iris'))
print(iris.sepal_width.sum())  # Runs immediately and prints the result

Por padrão, options.verbose é True no DataWorks, fazendo com que a URL do Logview e outros detalhes de execução apareçam no log durante a execução.

Exemplo: consultar uma tabela do MaxCompute com DataFrame

  1. Prepare um conjunto de dados e crie uma tabela chamada pyodps_iris. Consulte Processamento de dados com DataFrame.

  2. Crie um objeto DataFrame a partir da tabela. Consulte Criar um objeto DataFrame a partir de uma tabela do MaxCompute.

  3. Insira o seguinte código no editor de código e execute o nó:

    from odps.df import DataFrame
    
    # Create a DataFrame from the MaxCompute table
    iris = DataFrame(o.get_table('pyodps_iris'))
    print(iris.sepallength.head(5))

    Saída esperada:

       sepallength
    0          4.5
    1          5.5
    2          4.9
    3          5.0
    4          6.0

Configurar parâmetros de agendamento

Diferentemente dos nós SQL, o código dos nós PyODPS não realiza substituição de strings ${param_name}. Em vez disso, o DataWorks injeta os parâmetros de agendamento no nó como um dicionário global args antes da execução.

Etapa 1: Adicionar parâmetros nas propriedades do nó

Abra a aba Properties do nó (painel de navegação à direita na aba de configuração) e adicione entradas na seção Scheduling Parameter. Para diferenças de formato e sintaxe entre tipos de nós, consulte Configurar parâmetros de agendamento para diferentes tipos de nós.

Etapa 2: Ler parâmetros no código

Por exemplo, se você definir ds=${yyyymmdd} na seção Scheduling Parameter, leia o valor no seu código da seguinte forma:

print('ds=' + args['ds'])
# Output: ds=20161116

Para obter a partição correspondente a essa data:

o.get_table('table_name').get_partition('ds=' + args['ds'])
Os parâmetros de agendamento personalizados para nós PyODPS devem ser definidos com um valor constante. Ao contrário dos nós SQL, o valor não é substituído automaticamente em tempo de execução.

Para mais cenários de desenvolvimento de tarefas PyODPS, consulte:

Próximos passos