Todos los productos
Search
Centro de documentos

MaxCompute:Función con valores de tabla definida por el usuario (UDTF) en Python 3

Última actualización: Sep 05, 2026

MaxCompute es compatible con Python 3 mediante CPython 3.7.3. Python 2 ya alcanzó su fin de vida útil (EOL), por lo que debe escribir todas las funciones con valores de tabla definidas por el usuario (UDTF) nuevas en Python 3.

Habilite Python 3

De forma predeterminada, los proyectos de MaxCompute usan Python 2 para las UDF. Para usar Python 3, agregue a continuación el comando de nivel de sesión antes de su instrucción SQL y envíelos juntos:

set odps.sql.python.version=cp37;

Estructura del código de una UDTF

Use MaxCompute Studio para escribir el código de la UDTF en Python 3. Una UDTF consta de cuatro componentes:

Componente

Obligatorio

Descripción

Importaciones de módulos

Obligatorio

Debe incluir from odps.udf import annotate y from odps.udf import BaseUDTF. Si necesita hacer referencia a archivos o tablas, agregue también from odps.distcache import get_cache_file o from odps.distcache import get_cache_table.

Firma de la función

Opcional

Se declara con @annotate(<signature>). Define los tipos de datos de los parámetros de entrada y de los valores de retorno. Sin firma, se acepta cualquier tipo de dato de entrada y todos los valores de retorno toman STRING como valor predeterminado.

Clase de Python personalizada

Obligatorio

Es una clase derivada de BaseUDTF. Define las variables y los métodos de su lógica de negocio.

Métodos de la clase

Obligatorio

Implemente los métodos obligatorios que se describen en la tabla a continuación.

Métodos de la clase

Método

Obligatorio

Momento de ejecución

Descripción

BaseUDTF.init()

Opcional

Una vez, antes del primer registro

Método de inicialización. Al sobrescribirlo, llame a super(BaseUDTF, self).init() al inicio. Úselo para configurar el estado interno que persiste entre registros.

BaseUDTF.process([args, ...])

Obligatorio

Una vez por cada registro SQL

Procesa cada fila de entrada. Los parámetros de la función process son los parámetros de entrada de la UDTF especificados en las instrucciones SQL.

BaseUDTF.forward([args, ...])

Obligatorio

Lo invoca su código

Genera una fila por cada llamada. Los parámetros del método forward son los parámetros de salida de la UDTF especificados en las instrucciones SQL. Si no hay firma de función, convierta todos los valores a STRING antes de llamar a forward.

BaseUDTF.close()

Opcional

Una vez, antes del último registro

Método de limpieza. Úselo para liberar recursos cuando finaliza la UDTF.

A continuación se muestra un ejemplo de una UDTF mínima que divide una cadena separada por comas en filas individuales:

# Import the function signature module and the base class.
from odps.udf import annotate
from odps.udf import BaseUDTF

# Function signature: takes a STRING, returns a STRING.
@annotate('string -> string')

# Custom Python class derived from BaseUDTF.
class Explode(BaseUDTF):

    def process(self, arg):
        props = arg.split(',')
        for p in props:
            self.forward(p)
Las UDTF de Python 2 y las de Python 3 se ejecutan sobre versiones subyacentes de Python distintas. Escriba cada UDTF según la sintaxis y las capacidades de la versión de Python correspondiente.

Límites

Python 3 no es compatible con Python 2. No se pueden combinar UDTF de Python 2 y de Python 3 en una misma instrucción SQL.

Migre las UDTF de Python 2

Python 2 ya alcanzó su fin de vida útil. Migre sus UDTF de Python 2 existentes según la situación de su proyecto:

  • Proyecto nuevo o primera UDTF en Python: escriba todas las UDTF en Python 3 desde el inicio.

  • Proyecto existente con varias UDTF de Python 2: realice la migración de forma gradual para evitar interrupciones. Elija uno de los siguientes enfoques:

    • Escriba las UDTF nuevas en Python 3 y habilite Python 3 a nivel de sesión para los trabajos que usen esas UDTF. Para más detalles, consulte Enable Python 3.

    • Reescriba las UDTF de Python 2 existentes para que sean compatibles tanto con Python 2 como con Python 3. Consulte Porting Python 2 Code to Python 3 para obtener orientación.

Si una UDTF se comparte entre varios proyectos de MaxCompute, hágala compatible con Python 2 y Python 3. Así evitará afectar los proyectos que todavía usan Python 2.

Bibliotecas de terceros

NumPy no está incluido en el entorno de ejecución de Python 3 de MaxCompute. Para usar NumPy en una UDTF, cargue manualmente un paquete wheel de NumPy como recurso. El nombre de archivo esperado, obtenido de Python Package Index (PyPI) o de una imagen, es:

numpy-<Version>-cp37-cp37m-manylinux1_x86_64.whl

Para consultar las instrucciones sobre cómo cargar el paquete, consulte Resource operations o Reference third-party packages in Python UDFs.

Firmas de función y tipos de datos

La firma de una función declara los tipos de datos de los parámetros de entrada y de los valores de retorno de una UDTF. MaxCompute valida la firma durante el análisis semántico y devuelve un error si los tipos reales no coinciden.

Formato de la firma

@annotate('arg_type_list -> type_list')
  • arg_type_list: tipos de los parámetros de entrada, separados por comas. Establezca este valor en * para aceptar cualquier cantidad de parámetros, o déjelo en blanco para no aceptar ninguno.

  • type_list: tipos de los valores de retorno. Una UDTF puede devolver varias columnas.

Tipos compatibles para type_list: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale) y tipos complejos (ARRAY, MAP, STRUCT), incluidos los tipos complejos anidados.

Tipos compatibles para arg_type_list: todos los tipos anteriores, además de CHAR y VARCHAR.

Seleccione los tipos de datos según la data type edition de su proyecto de MaxCompute.

Ejemplos de firmas

Firma

Descripción

@annotate('bigint,boolean->string,datetime')

Dos parámetros de entrada (BIGINT, BOOLEAN) y dos valores de retorno (STRING, DATETIME).

@annotate('*->string,datetime')

Cualquier cantidad de parámetros de entrada y dos valores de retorno (STRING, DATETIME).

@annotate('->double,bigint,string')

Sin parámetros de entrada y tres valores de retorno (DOUBLE, BIGINT, STRING).

@annotate("array<string>,struct<a1:bigint,b1:string>,string->map<string,bigint>,struct<b1:bigint>")

Entradas y salidas de tipos complejos.

Asignaciones de tipos de datos

Escriba las UDTF en Python con los tipos de Python que corresponden a los tipos de MaxCompute SQL:

Tipo de MaxCompute SQL

Tipo de Python 3

BIGINT

INT

STRING

UNICODE

DOUBLE

FLOAT

BOOLEAN

BOOL

DATETIME

DATETIME.DATETIME

FLOAT

FLOAT

CHAR

UNICODE

VARCHAR

UNICODE

BINARY

BYTES

DATE

DATETIME.DATE

DECIMAL

DECIMAL.DECIMAL

ARRAY

LIST

MAP

DICT

STRUCT

COLLECTIONS.NAMEDTUPLE

Referencia a recursos

Haga referencia a archivos y tablas en una UDTF de Python mediante el módulo odps.distcache.

odps.distcache.get_cache_file(resource_name)

Devuelve el contenido de un recurso de archivo.

  • resource_name: nombre de un recurso de archivo existente en su proyecto de MaxCompute. Devuelve un error si el nombre no es válido o si el archivo no existe.

  • Devuelve un objeto similar a un archivo. Llame a close() sobre el objeto al terminar para liberar el identificador del archivo.

  • Declare el recurso de archivo al crear la UDTF. Si omite esta declaración, la llamada a la UDTF devolverá un error.

odps.distcache.get_cache_table(resource_name)

Devuelve el contenido de un recurso de tabla.

  • resource_name: nombre de un recurso de tabla existente en su proyecto de MaxCompute. Devuelve un error si el nombre no es válido o si la tabla no existe.

  • Devuelve un generador. Al iterarlo, produce un registro por cada fila, donde cada registro es un ARRAY.

En el siguiente ejemplo se leen datos de un archivo JSON y de un recurso de tabla, y luego se generan filas a partir de una búsqueda:

from odps.udf import annotate
from odps.udf import BaseUDTF
from odps.distcache import get_cache_file
from odps.distcache import get_cache_table

@annotate('string -> string, bigint')
class UDTFExample(BaseUDTF):

    def __init__(self):
        import json
        # Load the JSON file resource into a dict.
        cache_file = get_cache_file('test_json.txt')
        self.my_dict = json.load(cache_file)
        cache_file.close()

        # Append records from the table resource into the dict.
        records = list(get_cache_table('table_resource1'))
        for record in records:
            self.my_dict[record[0]] = record[1]

    def process(self, pageid):
        # For each input pageid, forward all associated adid values.
        for adid in self.my_dict[pageid]:
            self.forward(pageid, adid)

Llame a una UDTF de Python 3

Una vez que desarrolle una UDTF de Python 3 siguiendo la development process, podrá llamarla desde MaxCompute SQL.

  • Dentro de un proyecto: llame a la UDTF de la misma manera que a una función integrada.

  • Entre proyectos: haga referencia a una UDTF de otro proyecto usando el nombre del proyecto como prefijo:

    SELECT B:udf_in_other_project(arg0, arg1) AS res FROM table_t;

    Para configurar el uso compartido de recursos entre proyectos, consulte Package-based resource sharing across projects.

Para desarrollar y probar una UDTF de Python 3 en MaxCompute Studio, consulte Develop a Python UDF.