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 |
|
UDF de SQL temporal |
Se crea con |
|
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 |
|
|
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. |
|
|
Sí |
Parámetros de entrada. Cada uno lleva el prefijo |
|
|
Sí |
Tipo de datos de cada parámetro de entrada. Debe ser un tipo de datos compatible con MaxCompute. |
|
|
No |
Variable de retorno. Si se omite, se devuelve el valor de |
|
|
Sí |
Expresión SQL que implementa la lógica de la función. Puede hacer referencia a operadores integrados, funciones integradas u otras UDF. |
|
|
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 |