Todos los productos
Search
Centro de documentos

MaxCompute:Desarrollo de una tarea PyODPS 2

Última actualización: Sep 04, 2026

Los nodos PyODPS 2 permiten escribir código Python directamente en DataWorks para procesar datos de MaxCompute mediante el SDK de Python PyODPS.

Requisitos previos

Antes de empezar, asegúrese de que cuenta con lo siguiente:

Funcionamiento

PyODPS es el SDK de Python para MaxCompute. En DataWorks, cada nodo PyODPS incluye una variable global preinyectada odps (también disponible como alias o) que funciona como punto de entrada a MaxCompute. El código Python se escribe contra este punto de entrada para consultar tablas, ejecutar sentencias SQL, gestionar recursos y procesar datos. DataWorks también inyecta un diccionario global args para que el código pueda leer los parámetros de programación en tiempo de ejecución.

La única diferencia entre los nodos PyODPS 2 y PyODPS 3 radica en la capa de Python: PyODPS 2 utiliza Python 2.7 y PyODPS 3 utiliza Python 3.

Límites

Constraint

Details

Versión de Python

2.7

Procesamiento local de datos (resource group exclusivo)

Mantenga el uso por debajo de 50 MB. Superar este límite puede provocar un error de falta de memoria (OOM) y la finalización del proceso con el mensaje Got killed

CUs (resource group serverless)

Hasta 64 CUs por tarea; manténgase dentro de las 16 CUs para evitar escasez de recursos durante el inicio

Tareas simultáneas de Python

Una tarea a la vez por nodo

Tamaño del registro de salida

Hasta 4 MB

Paquetes de terceros con código binario

No compatible

Bibliotecas preinstaladas

NumPy y pandas (utilizables fuera de funciones definidas por el usuario [UDF])

InstanceTunnel

Deshabilitado de forma predeterminada; establezca options.tunnel.use_instance_tunnel = True para habilitarlo globalmente

El límite de memoria de 50 MB aplica únicamente a operaciones locales de datos. Las tareas de SQL y DataFrame (excepto to_pandas ) iniciadas por PyODPS no están sujetas a este límite.

Notas de uso

Paquetes de terceros

Para utilizar un paquete de terceros en un nodo PyODPS, use un resource group serverless y cree una imagen personalizada que incluya dicho paquete.

Si su código UDF requiere un paquete de terceros, el enfoque de imagen personalizada no aplica. Consulte en su lugar Ejemplo: Referencia a paquetes de terceros en UDF de Python.

Acceso a la red

Para acceder a un origen de datos en una virtual private cloud (VPC) o en un centro de datos local, ejecute el nodo en un resource group serverless y configure una conexión de red entre el resource group y el origen de datos. Consulte Soluciones de conectividad de red.

Actualización de PyODPS

  • En un resource group serverless: utilice la función de gestión de imágenes para ejecutar /home/tops/bin/pip3 install pyodps==0.12.1 en un nodo PyODPS 3 (reemplace 0.12.1 con su versión objetivo). Consulte Gestionar imágenes.

  • En un resource group exclusivo para programación: utilice la función O&M Assistant para ejecutar el mismo comando en un nodo PyODPS 3. Consulte Uso de la función O&M Assistant.

Registros de salida

Mantenga la salida de registros ligera. Incluya registros de alertas y puntos de control de progreso en lugar de volcar grandes conjuntos de datos al registro. El límite de 4 MB aplica a todo el registro de salida de una ejecución de nodo.

Linaje de datos

Si las sentencias SQL en un nodo PyODPS no generan linajes de datos en Data Map, pase los parámetros de tiempo de ejecución del programador de DataWorks como sugerencias (hints) de SQL. El siguiente código muestra cómo recopilar estos parámetros y pasarlos al ejecutar 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 obtener más información, consulte Visualizar linajes de datos y Configurar el parámetro hints.

Escritura y ejecución de código

Para consultar la referencia completa de sintaxis de PyODPS, véase Descripción general.

Uso del punto de entrada de MaxCompute

Cada nodo PyODPS preinyecta odps (y su alias o) como punto de entrada a MaxCompute. No es necesario inicializar un cliente manualmente.

print(odps.exist_table('PyODPS_iris'))

Ejecución de sentencias SQL

Utilice o.execute_sql() para ejecutar sentencias SQL en MaxCompute.

De forma predeterminada, InstanceTunnel está deshabilitado. Al leer resultados con instance.open_reader, la interfaz Result limita la lectura a 10,000 registros. Para leer todos los registros, habilite 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 habilitar InstanceTunnel en una sola operación de lectura sin modificar la configuración global:

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

Lectura de resultados de consultas SQL

Utilice open_reader para procesar los resultados de las consultas.

Para sentencias SQL que devuelven datos estructurados:

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

Para sentencias DDL como DESC, utilice reader.raw para obtener la salida sin procesar:

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

Configuración de parámetros de tiempo de ejecución

Pase la configuración de tiempo de ejecución a la ejecución de SQL mediante el parámetro hints (un diccionario):

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

Para aplicar la configuración globalmente en todas las ejecuciones de SQL dentro del nodo:

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 obtener más información sobre los hints compatibles, consulte Operaciones SET.

Uso de DataFrame para procesar datos

No se recomienda el uso de DataFrame. Considere utilizar SQL u otros enfoques compatibles.

Las operaciones de la API de DataFrame son diferidas (lazy); se ejecutan únicamente cuando se invoca un método de ejecución inmediata.

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 la ejecución implícita en métodos de visualización, establezca options.interactive en True al inicio del nodo:

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

De forma predeterminada, options.verbose es True en DataWorks, por lo que la URL de Logview y otros detalles de ejecución aparecen en el registro durante la ejecución.

Ejemplo: consulta de una tabla de MaxCompute con DataFrame

  1. Prepare un conjunto de datos y cree una tabla llamada pyodps_iris. Consulte Procesamiento de datos con DataFrame.

  2. Cree un objeto DataFrame a partir de la tabla. Consulte Create a DataFrame object from a MaxCompute table.

  3. Introduzca el siguiente código en el editor de código y ejecute el nodo:

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

    Salida esperada:

       sepallength
    0          4.5
    1          5.5
    2          4.9
    3          5.0
    4          6.0

Configuración de parámetros de programación

A diferencia de los nodos SQL, el código de los nodos PyODPS no realiza sustitución de cadenas ${param_name}. En su lugar, DataWorks inyecta los parámetros de programación en el nodo como un diccionario global args antes de que se ejecute el nodo.

Paso 1: Agregar parámetros en las propiedades del nodo

Abra la pestaña Properties del nodo (panel de navegación derecho en la pestaña de configuración) y agregue entradas en la sección Scheduling Parameter. Para conocer el formato y las diferencias de sintaxis entre tipos de nodos, consulte Configuración de parámetros de programación para diferentes tipos de nodos.

Paso 2: Leer parámetros en el código

Por ejemplo, si establece ds=${yyyymmdd} en la sección Scheduling Parameter, lea el valor en su código de la siguiente manera:

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

Para obtener la partición correspondiente a esa fecha:

o.get_table('table_name').get_partition('ds=' + args['ds'])
Los parámetros de programación personalizados para nodos PyODPS deben establecerse con un valor constante. A diferencia de los nodos SQL, el valor no se sustituye automáticamente en tiempo de ejecución.

Para conocer más escenarios de desarrollo de tareas PyODPS, consulte:

Pasos siguientes