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 |
|
Firma de la función |
Opcional |
Se declara con |
|
Clase de Python personalizada |
Obligatorio |
Es una clase derivada de |
|
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 |
|
|
Opcional |
Una vez, antes del primer registro |
Método de inicialización. Al sobrescribirlo, llame a |
|
|
Obligatorio |
Una vez por cada registro SQL |
Procesa cada fila de entrada. Los parámetros de la función |
|
|
Obligatorio |
Lo invoca su código |
Genera una fila por cada llamada. Los parámetros del método |
|
|
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 |
|
|
Dos parámetros de entrada (BIGINT, BOOLEAN) y dos valores de retorno (STRING, DATETIME). |
|
|
Cualquier cantidad de parámetros de entrada y dos valores de retorno (STRING, DATETIME). |
|
|
Sin parámetros de entrada y tres valores de retorno (DOUBLE, BIGINT, STRING). |
|
|
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.