Las funciones con valor de tabla definidas por el usuario (UDTF) permiten extender las capacidades integradas de MaxCompute mediante la escritura de funciones personalizadas en Java o Python. Una UDTF lee una fila de entrada y devuelve varias filas; la salida se trata como una tabla.
MaxCompute incluye algunas UDTF integradas, como EXPLODE. Para obtener más información, consulte Other functions y Complex type functions.
Cuándo usar UDTF
Utilice una UDTF cuando las funciones integradas no puedan expresar su lógica; por ejemplo, cuando necesite emitir un número variable de filas de salida por cada fila de entrada, o cuando su transformación dependa del estado acumulado a través de las filas en una partición.
Las funciones integradas están optimizadas para el motor distribuido de MaxCompute y superan en rendimiento a las UDTF a gran escala. Utilice las funciones integradas siempre que cubran su caso de uso.
Lenguajes compatibles
|
Lenguaje |
Versión |
|
Java |
— |
|
Python 2 |
2.7 |
|
Python 3 |
CPython 3.7.3 |
Para detalles de implementación, consulte Java UDTFs, Python 2 UDTF y Python 3 UDTFs.
Limitaciones
Acceso a Internet: De forma predeterminada, las UDF no pueden acceder a Internet. Para habilitar el acceso a Internet, complete el formulario de solicitud de conexión de red. Tras la aprobación, el equipo de soporte técnico de MaxCompute se pondrá en contacto con usted para establecer la conexión. Para más detalles, consulte Network connection process.
-
No se admiten otras columnas en la misma sentencia
SELECT: Una sentenciaSELECTque invoque una UDTF no puede hacer referencia a otras columnas ni expresiones. La siguiente sentencia no es válida:-- Invalid: mixes a UDTF with another column select value, user_udtf(key) as mycol ... -
No se permite anidamiento: Las UDTF no pueden anidarse dentro de otras UDTF. La siguiente sentencia no es válida:
-- Invalid: user_udtf2 is nested inside user_udtf1 select user_udtf1(user_udtf2(key)) as mycol...; -
Incompatibilidad con
GROUP BY,DISTRIBUTE BYySORT BY: Una UDTF no puede aparecer en la misma sentenciaSELECTjunto con estas cláusulas. La siguiente sentencia no es válida:-- Invalid: UDTF used with GROUP BY select user_udtf(key) as mycol ... group by mycol;
Notas de uso
Memoria: Si un trabajo de UDF procesa grandes volúmenes de datos con sesgo de datos, el trabajo podría exceder la asignación de memoria JVM predeterminada. Ejecute el siguiente comando a nivel de sesión para aumentar la memoria:
set odps.sql.udf.joiner.jvm.memory=xxxx;
Para consultar la lista completa de temas frecuentes sobre UDF, véase Preguntas frecuentes sobre UDF de MaxCompute.
Conflictos de nombres: Si una UDF comparte nombre con una función integrada, MaxCompute ejecutará la UDF. Para invocar explícitamente la función integrada, añada el prefijo :::
select ::concat('ab', 'c');
Proceso de desarrollo
Los pasos difieren ligeramente entre Java y Python.
Java
|
Paso |
Obligatorio |
Descripción |
Herramienta |
|
1 |
No |
Agregue la dependencia SDK de Maven a su archivo POM. Busque |
IntelliJ IDEA (Maven) |
|
2 |
Sí |
Escriba el código de la UDTF. |
IntelliJ IDEA (Maven) o MaxCompute Studio |
|
3 |
Sí |
Depure la UDTF en su máquina local o mediante pruebas unitarias. |
— |
|
4 |
Sí |
Empaquete la UDTF en un archivo JAR. |
— |
|
5 |
Sí |
Cargue el archivo JAR como recurso en su proyecto de MaxCompute. |
|
|
6 |
Sí |
Registre la UDTF utilizando el archivo JAR cargado. |
— |
|
7 |
No |
Invoque la UDTF en una consulta SQL. |
— |
Para el paso 2, consulte Desarrollar una UDF en Java. Para el paso 5, consulte Agregar recursos y Create a function. Para empaquetar y registrar en un solo flujo mediante MaxCompute Studio, consulte Empaquetar un programa Java, cargar el paquete y crear una UDF de MaxCompute.

Python
|
Paso |
Obligatorio |
Descripción |
Herramienta |
|
1 |
Sí |
Escriba el código de la UDTF. |
|
|
2 |
Sí |
Depure la UDTF en su máquina local o mediante pruebas unitarias. |
— |
|
3 |
Sí |
Cargue archivos Python o los recursos necesarios (recursos de archivo, recursos de tabla, paquetes de terceros) en su proyecto de MaxCompute. |
|
|
4 |
Sí |
Registre la UDTF basándose en los archivos cargados. |
— |
|
5 |
No |
Invoque la UDTF en una consulta SQL. |
— |
Para el paso 1, consulte Desarrollar una UDF en Python. Para el paso 3, consulte Agregar recursos y Create a function. Para cargar y registrar en un solo flujo mediante MaxCompute Studio, consulte Cargar un programa Python y crear una UDF de MaxCompute.

Invocar una UDTF
Dentro del mismo proyecto: Invoque una UDTF de la misma manera que invoca una función integrada.
Entre proyectos: Para invocar una UDTF del proyecto B dentro del proyecto A, utilice la siguiente sintaxis:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Para obtener más información sobre el uso compartido de recursos entre proyectos, consulte Uso compartido de recursos basado en paquetes entre proyectos.