- 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.
user_defined_executable_functions_config.
La configuración de una función contiene las siguientes opciones:
| Parámetro | Descripción | Obligatorio | Valor predeterminado |
|---|---|---|---|
name | Nombre de la función | Sí | - |
command | Nombre del script que se debe ejecutar, o comando si execute_direct es false | Sí | - |
argument | Descripción del argumento con el type y, opcionalmente, el name del argumento. Cada argumento se describe en un ajuste independiente. Es necesario especificar el nombre si los nombres de los argumentos forman parte de la serialización en un formato de función definida por el usuario como Native o JSONEachRow | Sí | c + argument_number |
format | Un formato en el que se pasan los argumentos al comando. Se espera que la salida del comando también use el mismo formato | Sí | - |
return_type | El tipo del valor devuelto | Sí | - |
return_name | Nombre del valor devuelto. Es necesario especificar el nombre de retorno si forma parte de la serialización en un formato de función definida por el usuario como Native o JSONEachRow | Opcional | result |
type | Un tipo ejecutable. Si type está establecido en executable, se inicia un único comando. Si está establecido en executable_pool, se crea un pool de comandos | Sí | - |
max_command_execution_time | Tiempo máximo de ejecución, en segundos, para procesar un bloque de datos. Este ajuste solo es válido para comandos executable_pool | Opcional | 10 |
command_termination_timeout | Tiempo, en segundos, durante el cual un comando debe finalizar después de que se cierre su pipe. Transcurrido ese tiempo, se envía SIGTERM al proceso que ejecuta el comando | Opcional | 10 |
command_read_timeout | Tiempo de espera para leer datos del stdout del comando, en milisegundos | Opcional | 10000 |
command_write_timeout | Tiempo de espera para escribir datos en el stdin del comando, en milisegundos | Opcional | 10000 |
pool_size | Tamaño del pool de comandos | Opcional | 16 |
send_chunk_header | Controla si se debe enviar el recuento de filas antes de enviar un fragmento de datos al proceso | Opcional | false |
execute_direct | Si execute_direct = 1, command se buscará dentro de la carpeta user_scripts especificada por user_scripts_path. Se pueden especificar argumentos adicionales del script usando espacios en blanco como separador. Ejemplo: script_name arg1 arg2. Si execute_direct = 0, command se pasa como argumento a bin/sh -c | Opcional | 1 |
lifetime | Intervalo de recarga de una función, en segundos. Si está establecido en 0, la función no se recarga | Opcional | 0 |
deterministic | Si la función es determinista (devuelve el mismo resultado para la misma entrada) | Opcional | false |
stderr_reaction | Cómo manejar la salida de stderr del comando. Valores: none (ignorar), log (registrar inmediatamente todo stderr), log_first (registrar los primeros 4 KiB después de finalizar), log_last (registrar los últimos 4 KiB después de finalizar), throw (lanzar una excepción inmediatamente ante cualquier salida en stderr). Al usar log_first o log_last con un código de salida distinto de cero, el contenido de stderr se incluye en el mensaje de excepción | Opcional | log_last |
check_exit_code | Si es true, ClickHouse comprobará el código de salida del comando. Un código de salida distinto de cero provoca una excepción | Opcional | true |
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
test_function_sum manualmente, estableciendo execute_direct en 0 mediante una configuración XML o YAML.
- XML
- 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
STDIN y lo devuelve como una cadena.
Cree test_function mediante una configuración XML o YAML.
- XML
- 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
test_function_sum_json con argumentos con nombre y el formato JSONEachRow mediante configuración XML o YAML.
- XML
- 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
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.
- XML
- YAML
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
- XML
- YAML
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
Evaluación de las expresiones de los argumentos
&&, || 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
SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
- si una
distributed_tabletiene 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_tabletiene solo un segmento, todas las funciones ‘f’, ‘g’ y ‘h’ se ejecutan en el servidor de ese segmento.
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.