Saltar al contenido principal

UDFs Funciones definidas por el usuario

ClickHouse admite varios tipos de funciones definidas por el usuario (UDFs):
  • Executable UDFs inician un programa o script externo (Python, Bash, etc.) y envían bloques de datos a través de STDIN / STDOUT. Úselas para integrar código o herramientas existentes sin recompilar ClickHouse. Tienen una mayor sobrecarga por llamada en comparación con las opciones dentro del proceso y son más adecuadas para lógica más pesada o cuando se requiere un entorno de ejecución diferente.
  • SQL UDFs se definen con CREATE FUNCTION únicamente en SQL. Se insertan o expanden en el plan de consulta (sin cambiar de proceso), lo que las hace ligeras e ideales para reutilizar lógica de expresiones o simplificar columnas calculadas complejas.
  • Experimental WebAssembly UDFs ejecutan código compilado en WebAssembly dentro de un entorno aislado en el proceso del servidor. Ofrecen una menor sobrecarga por llamada que los ejecutables externos, con mejor aislamiento que las extensiones nativas, lo que las hace adecuadas para algoritmos personalizados escritos en lenguajes que pueden compilarse a WASM (p. ej., C/C++/Rust).

Funciones ejecutables definidas por el usuario

Esta funcionalidad está disponible en vista previa privada en ClickHouse Cloud. Póngase en contacto con soporte de ClickHouse en https://clickhouse.cloud/support para obtener acceso.
ClickHouse puede invocar cualquier programa ejecutable externo o script para procesar datos. La configuración de las funciones ejecutables definidas por el usuario puede encontrarse en uno o varios archivos XML. La ruta de la configuración se especifica en el parámetro user_defined_executable_functions_config. La configuración de una función contiene las siguientes opciones: El comando debe leer los argumentos desde STDIN y escribir el resultado en STDOUT. El comando debe procesar los argumentos de forma iterativa. Es decir, después de procesar un fragmento de argumentos, debe esperar al siguiente fragmento.

Funciones ejecutables definidas por el usuario

Ejemplos

UDF a partir de un script inline

Cree test_function_sum manualmente, estableciendo execute_direct en 0 mediante una configuración XML o YAML.
Archivo test_function.xml (/etc/clickhouse-server/test_function.xml con la configuración de rutas predeterminada).
/etc/clickhouse-server/test_function.xml

Query
Result

UDF a partir de un script de Python

En este ejemplo, creamos una UDF que lee un valor de STDIN y lo devuelve como una cadena. Cree test_function mediante una configuración XML o YAML.
Archivo test_function.xml (/etc/clickhouse-server/test_function.xml con la ruta predeterminada).
/etc/clickhouse-server/test_function.xml

Cree el archivo de script test_function.py dentro de la carpeta user_scripts (/var/lib/clickhouse/user_scripts/test_function.py con la ruta predeterminada).
Query
Result

Leer dos valores de STDIN y devolver su suma como un objeto JSON

Cree test_function_sum_json con argumentos con nombre y el formato JSONEachRow mediante configuración XML o YAML.
Archivo test_function.xml (/etc/clickhouse-server/test_function.xml con la ruta predeterminada).
/etc/clickhouse-server/test_function.xml

Cree el archivo de script test_function_sum_json.py dentro de la carpeta user_scripts (/var/lib/clickhouse/user_scripts/test_function_sum_json.py con la ruta predeterminada).
Query
Result

Usar parámetros en la opción command

Las funciones definidas por el usuario ejecutables pueden aceptar parámetros constantes configurados en la opción command (esto solo funciona para funciones definidas por el usuario de tipo executable). También requiere la opción execute_direct para garantizar que no exista ninguna vulnerabilidad por expansión de argumentos del shell.
Archivo test_function_parameter_python.xml (/etc/clickhouse-server/test_function_parameter_python.xml con la ruta predeterminada).
/etc/clickhouse-server/test_function_parameter_python.xml

Cree el archivo de script test_function_parameter_python.py dentro de la carpeta user_scripts (/var/lib/clickhouse/user_scripts/test_function_parameter_python.py con la ruta predeterminada).
Query
Result

UDF desde un script de shell

En este ejemplo, creamos un script de shell que multiplica cada valor por 2.
Archivo test_function_shell.xml (/etc/clickhouse-server/test_function_shell.xml con la ruta predeterminada).
/etc/clickhouse-server/test_function_shell.xml

Cree el archivo de script test_shell.sh dentro de la carpeta user_scripts (/var/lib/clickhouse/user_scripts/test_shell.sh con la ruta predeterminada).
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result

Manejo de errores

Algunas funciones pueden lanzar una excepción si los datos no son válidos. En ese caso, la consulta se cancela y se devuelve un mensaje de error al cliente. En el procesamiento distribuido, cuando se produce una excepción en uno de los servidores, los demás servidores también intentan cancelar la consulta.

Evaluación de las expresiones de los argumentos

En casi todos los lenguajes de programación, puede que uno de los argumentos no se evalúe para ciertos operadores. Normalmente, se trata de los operadores &&, || y ?:. En ClickHouse, los argumentos de las funciones (operadores) siempre se evalúan. Esto se debe a que se evalúan partes enteras de las columnas de una sola vez, en lugar de calcular cada fila por separado.

Ejecución de funciones para el procesamiento distribuido de consultas

En el procesamiento distribuido de consultas, se realizan en servidores remotos tantas etapas del procesamiento de la consulta como sea posible, y el resto de las etapas (la fusión de resultados intermedios y todo lo posterior) se realiza en el servidor solicitante. Esto significa que las funciones pueden ejecutarse en distintos servidores. Por ejemplo, en la consulta SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
  • si una distributed_table tiene al menos dos segmentos, las funciones ‘g’ y ‘h’ se ejecutan en servidores remotos, y la función ‘f’ se ejecuta en el servidor solicitante.
  • si una distributed_table tiene solo un segmento, todas las funciones ‘f’, ‘g’ y ‘h’ se ejecutan en el servidor de ese segmento.
El resultado de una función normalmente no depende del servidor en el que se ejecute. Sin embargo, a veces esto sí es importante. Por ejemplo, las funciones que trabajan con diccionarios usan el diccionario que existe en el servidor en el que se están ejecutando. Otro ejemplo es la función hostName, que devuelve el nombre del servidor en el que se está ejecutando, para poder hacer GROUP BY por servidores en una consulta SELECT. Si una función de una consulta se ejecuta en el servidor solicitante, pero necesita ejecutarla en servidores remotos, puede envolverla en una función de agregación ‘any’ o añadirla a una clave de GROUP BY.

Funciones SQL definidas por el usuario

Las funciones personalizadas a partir de expresiones lambda se pueden crear mediante la sentencia CREATE FUNCTION. Para eliminar estas funciones, utilice la sentencia DROP FUNCTION.

Funciones definidas por el usuario de WebAssembly

Las funciones definidas por el usuario (UDFs) de WebAssembly (WASM) permiten ejecutar código personalizado compilado a WebAssembly dentro del proceso del servidor de ClickHouse.

Inicio rápido

Habilite la compatibilidad experimental con WebAssembly en la configuración de ClickHouse:
Inserte el módulo WASM compilado en la tabla del sistema:
Cree una función con su módulo WASM:
Utilice la función en sus consultas:

Más información

Consulta la documentación sobre funciones definidas por el usuario de WebAssembly para más información.
Última modificación el 25 de junio de 2026