Todos los productos
Search
Centro de documentos

MaxCompute:UDF (funciones definidas por el usuario de SQL)

Última actualización: Sep 07, 2026

Las funciones definidas por el usuario de SQL (UDF de SQL) permiten definir funciones reutilizables directamente en SQL, sin escribir código Java ni Python. A diferencia de las UDF de Java o Python, las UDF de SQL no requieren paso de compilación, carga de recursos ni flujo de trabajo de registro independiente; escriba el cuerpo de la función como una expresión SQL y comience a llamarla de inmediato.

Las UDF de SQL también admiten parámetros de tipo función, lo que permite pasar funciones integradas, otras UDF o funciones anónimas como argumentos, de forma similar a las expresiones Lambda.

Conceptos clave

Concepto

Descripción

UDF de SQL permanente

Se crea con CREATE SQL FUNCTION. Se almacena en el sistema de metadatos de MaxCompute, es visible en la lista de funciones y se puede llamar desde cualquier script o sesión.

UDF de SQL temporal

Se crea con FUNCTION (sin el prefijo CREATE SQL). Solo existe dentro del script donde se define y no se puede llamar en ningún otro lugar.

Parámetro de tipo función

Parámetro de entrada que acepta una función como valor: una función integrada, otra UDF o una función anónima.

Modo script de SQL

El modo de ejecución obligatorio al definir UDF de SQL. Definir una UDF en el modo de edición SQL común puede causar un error.

Requisitos previos

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

  • Un entorno que se ejecute en modo script de SQL. Para obtener más información, consulte SQL in script mode.

  • La confirmación de que los tipos de datos de los parámetros de entrada que planea usar son compatibles con MaxCompute. Para ver la lista completa, consulte MaxCompute V2.0 data type edition.

  • Los permisos de función obligatorios en su cuenta de Alibaba Cloud. Para obtener más información, consulte MaxCompute permissions.

Cree una UDF de SQL permanente

Las UDF de SQL permanentes se almacenan en el sistema de metadatos de MaxCompute. Después de su creación, aparecen en la lista de funciones y se pueden llamar desde cualquier fase.

Sintaxis

CREATE SQL FUNCTION <function_name>(@<parameter_in1> <datatype>[, @<parameter_in2> <datatype>...])
[RETURNS @<parameter_out> <datatype>]
AS [BEGIN]
<function_expression>
[END];

Parámetros

Parámetro

Obligatorio

Descripción

function_name

Sí

Nombre de la UDF de SQL. Debe ser único dentro del proyecto y no puede coincidir con ningún nombre de función integrada. Cada nombre solo se puede registrar una vez. Ejecute LIST FUNCTIONS para comprobar conflictos.

parameter_in

Sí

Parámetros de entrada. Cada uno lleva el prefijo @. Los parámetros pueden ser de tipo función; consulte Pass a function as a parameter.

datatype

Sí

Tipo de datos de cada parámetro de entrada. Debe ser un tipo de datos compatible con MaxCompute.

RETURNS @parameter_out

No

Variable de retorno. Si se omite, se devuelve el valor de function_name de forma predeterminada.

function_expression

Sí

Expresión SQL que implementa la lógica de la función. Puede hacer referencia a operadores integrados, funciones integradas u otras UDF.

BEGIN / END

No

Opcional. Se usa para encapsular lógica de varias sentencias cuando el cuerpo de la función contiene más de una sentencia.

Ejemplos

Función simple: suma 1 a una entrada BIGINT:

CREATE SQL FUNCTION my_add(@a BIGINT) AS @a + 1;

Función de varias sentencias que usa BEGIN / END:

CREATE SQL FUNCTION my_sum(@a BIGINT, @b BIGINT, @c BIGINT) RETURNS @my_sum BIGINT
AS BEGIN
    @temp := @a + @b;
    @my_sum := @temp + @c;
END;

Cree una UDF de SQL temporal

Las UDF de SQL temporales no se almacenan en MaxCompute. Solo existen dentro del script de SQL donde se definen y no se pueden llamar en otras sesiones o scripts.

Sintaxis

FUNCTION <function_name>(@<parameter_in1> <datatype>[, @<parameter_in2> <datatype>...])
[RETURNS @<parameter_out> <datatype>]
AS [BEGIN]
<function_expression>
[END];

Los parámetros son idénticos a los de CREATE SQL FUNCTION. Omita CREATE SQL para que la UDF sea temporal.

Ejemplo

FUNCTION my_add(@a BIGINT) AS @a + 1;

Consulte una UDF de SQL

Solo se pueden consultar las UDF de SQL permanentes; las UDF temporales no se almacenan en MaxCompute.

Para ejecutar DESC FUNCTION desde el cliente de MaxCompute (odpscmd), actualice el cliente a la versión 0.34.0 o posterior. Para obtener instrucciones de instalación y actualización, consulte MaxCompute client (odpscmd) .

Sintaxis

DESC FUNCTION <function_name>;

Ejemplo

DESC FUNCTION my_add;

Salida:

Name                  my_add
Owner                 ALIYUN$s***_****@**.aliyunid.com
Created Time          2021-05-08 11:26:02
SQL Definition Text   CREATE SQL FUNCTION MY_ADD(@a BIGINT) AS @a + 1

Llame a una UDF de SQL

Llame a una UDF de SQL de la misma manera que llama a una función integrada.

  • Las UDF de SQL permanentes se pueden llamar en cualquier fase.

  • Las UDF de SQL temporales solo se pueden llamar dentro del script donde se definen.

Los tipos de datos de los argumentos que pase deben coincidir con los tipos de datos definidos en la UDF.

Sintaxis

SELECT <function_name>(<column_name>[, ...]) FROM <table_name>;

Ejemplo

-- Create a table and insert sample data.
CREATE TABLE src (c BIGINT, d STRING);
INSERT INTO TABLE src VALUES (1, '100.1'), (2, '100.2'), (3, '100.3');

-- Call my_add on column c.
SELECT my_add(c) FROM src;

Salida:

+------------+
| _c0        |
+------------+
| 2          |
| 3          |
| 4          |
+------------+

Elimine una UDF de SQL

Sintaxis

DROP FUNCTION <function_name>;

Ejemplo

DROP FUNCTION my_add;

Pase una función como parámetro

Las UDF de SQL admiten parámetros de tipo función. Cuando declara un parámetro como FUNCTION (<input_type>) RETURNS <output_type>, quien llama puede pasar cualquier función compatible: una función integrada, otras UDF (Java, Python o SQL) o una función anónima.

Ejemplo

-- Define a SQL UDF.
FUNCTION add(@a BIGINT) AS @a + 1;

-- Define a higher-order UDF that accepts a function as an argument.
FUNCTION op(@a BIGINT, @fun FUNCTION (BIGINT) RETURNS BIGINT) AS @fun(@a);

-- Call op, passing different functions as the second argument.
-- add is a SQL UDF; abs is a MaxCompute built-in function.
SELECT op(key, add), op(key, abs) FROM VALUES (1), (2) AS t(key);

Salida:

+------------+------------+
| _c0        | _c1        |
+------------+------------+
| 2          | 1          |
| 3          | 2          |
+------------+------------+

_c0 es el resultado de add(key) (suma 1). _c1 es el resultado de abs(key) (valor absoluto). Para obtener más información sobre la función ABS, consulte Mathematical functions.

Para conocer las precauciones al usar expresiones Lambda en MaxCompute, consulte Lambda functions .

Use funciones anónimas

Al llamar a una UDF con un parámetro de tipo función, pase una función anónima en línea en lugar de una función con nombre. El compilador infiere los tipos de parámetro de la función anónima a partir de la firma de la UDF.

Ejemplo

FUNCTION op(@a BIGINT, @fun FUNCTION (BIGINT) RETURNS BIGINT) AS @fun(@a);

-- Pass an anonymous function as the second argument.
SELECT op(key, FUNCTION (@a) AS @a + 1) FROM VALUES (1), (2) AS t(key);

FUNCTION (@a) AS @a + 1 es la función anónima. Su tipo de parámetro se infiere a partir de la firma de op; no se necesita una declaración de tipo explícita.

Ejemplo: simplifique la lógica SQL repetida

Escenario: convertir cadenas de fecha de yyyy-mm-dd a yyyymmdd. Las fechas de entrada son 2020-11-21, 2020-1-01, 2019-5-1 y 19-12-1.

Uso de una UDF de SQL (recomendado)

Defina la lógica de conversión una sola vez y llame a la función donde sea necesario:

CREATE SQL FUNCTION y_m_d2yyyymmdd(@y_m_d STRING) RETURNS @yyyymmdd STRING
AS BEGIN
    @yyyymmdd := CONCAT(
        LPAD(SPLIT_PART(@y_m_d, '-', 1), 4, '0'),
        LPAD(SPLIT_PART(@y_m_d, '-', 2), 2, '0'),
        LPAD(SPLIT_PART(@y_m_d, '-', 3), 2, '0')
    );
END;

SELECT y_m_d2yyyymmdd(d) FROM VALUES ('2020-11-21'), ('2020-1-01'), ('2019-5-1'), ('19-12-1') AS t(d);

Salida:

+------------+
| _c0        |
+------------+
| 20201121   |
| 20200101   |
| 20190501   |
| 00191201   |
+------------+

Sin una UDF de SQL

Inserte la expresión completa en cada punto de llamada; esto dificulta el mantenimiento y es propenso a errores cuando es necesario cambiar la lógica:

SELECT CONCAT(
    LPAD(SPLIT_PART(d, '-', 1), 4, '0'),
    LPAD(SPLIT_PART(d, '-', 2), 2, '0'),
    LPAD(SPLIT_PART(d, '-', 3), 2, '0')
) FROM VALUES ('2020-11-21'), ('2020-1-01'), ('2019-5-1'), ('19-12-1') AS t(d);

Límites

Límite

Detalles

Modo de ejecución

Las UDF de SQL deben definirse en modo script de SQL. Definir una UDF en el modo de edición SQL común puede causar un error. Consulte SQL in script mode.

Compatibilidad de tipos de datos

Los tipos de datos de los parámetros de entrada deben ser tipos compatibles con MaxCompute. Los tipos de datos de los argumentos que se pasan al llamar a una UDF de SQL deben coincidir con los tipos definidos en la UDF. Consulte MaxCompute V2.0 data type edition.

Permisos

La creación, consulta, llamada o eliminación de una UDF de SQL requiere permisos de función. Consulte MaxCompute permissions.

Unicidad del nombre de función

Los nombres de función deben ser únicos dentro de un proyecto y no pueden coincidir con nombres de funciones integradas. Cada nombre solo se puede registrar una vez.

Ámbito de las UDF temporales

Las UDF de SQL temporales solo se pueden llamar dentro del script donde se definen. No se almacenan y no se pueden consultar en la lista de funciones.

Versión del cliente de consulta

La consulta de una UDF de SQL con DESC FUNCTION desde el cliente odpscmd requiere la versión del cliente 0.34.0 o posterior.

Pasos siguientes