Las funciones definidas por el usuario (UDF) permiten ampliar el comportamiento de ClickHouse más allá de lo que ofrecen las más de mil funciones integradas.
En ClickHouse Cloud, hay varias formas de crear y administrar funciones definidas por el usuario:
- Mediante SQL
- Mediante la UI y su propio código (beta pública)
- Mediante la Cloud API (beta)
- Mediante Terraform (beta)
Funciones definidas por el usuario en SQL
Las UDF de SQL se pueden crear con la sentencia CREATE FUNCTION a partir de una expresión lambda.
En este ejemplo, crearemos una función definida por el usuario ejecutable sencilla, isBusinessHours.
La función comprobará si un timestamp determinado está dentro del horario laboral habitual y devolverá true si es así; de lo contrario, false.
- Inicie sesión en Cloud Console y abra la consola SQL
- Escriba la siguiente consulta SQL para crear la función
isBusinessHours:
CREATE FUNCTION isBusinessHours AS (ts) ->
toDayOfWeek(ts) BETWEEN 1 AND 5
AND toHour(ts) BETWEEN 9 AND 17;- Ejecute lo siguiente para probar la UDF que acaba de crear:
SELECT isBusinessHours('2026-03-20 10:00:00'::DateTime), isBusinessHours('2026-03-20 23:00:00'::DateTime);Deberías obtener este resultado:
1 0- Puede usar el comando
DROP FUNCTIONpara eliminar la UDF que acaba de crear:
DROP FUNCTION isBusinessHoursEsto significa:
- La configuración a nivel de sesión (establecida mediante la instrucción
SET) no se propaga al contexto de ejecución de las UDF - Las UDF no heredan la configuración del perfil de usuario
- La configuración a nivel de consulta no se aplica durante la ejecución de las UDF
Funciones definidas por el usuario creadas desde la UI
ClickHouse Cloud permite crear funciones definidas por el usuario desde la UI.
En este ejemplo, crearemos la misma función ejecutable simple definida por el usuario isBusinessHours, que comprueba si una marca temporal determinada cae dentro del horario laboral habitual.
Anteriormente la creamos mediante SQL, pero esta vez la crearemos con Python y la configuraremos desde la UI.
Crear el archivo de Python
Crea un nuevo archivo main.py localmente:
cat > main.py << 'EOF'
import sys
from datetime import datetime
for line in sys.stdin:
ts = datetime.fromisoformat(line.strip())
result = 1 if (0 <= ts.weekday() <= 4 and 9 <= ts.hour <= 17) else 0
print(result)
sys.stdout.flush()
EOFSi tu script de Python importa paquetes de terceros, inclúyelos en un archivo requirements.txt y ClickHouse Cloud los instalará por ti. También puedes empaquetar las dependencias directamente en el archivo ZIP, pero entonces debes incluir paquetes en caché para ambas arquitecturas de CPU, así que requirements.txt es más sencillo. Por ejemplo:
requests>=2.28.0
numpy>=1.23.0Empaquetar dependencias y archivos locales
Para incluir los paquetes de dependencias y cualquier archivo local adicional (como archivos wheel, archivos de configuración o archivos de datos), colóquelos en el mismo directorio que main.py y requirements.txt. Al crear el archivo ZIP, incluya todos los archivos:
zip is_business_hours.zip main.py requirements.txtPuedes referenciar el directorio base de la ruta local incluida en tu código Python usando os.path.dirname(os.path.abspath(__file__)). Esto devuelve la ruta absoluta del directorio donde se encuentra tu main.py dentro del archivo ZIP, lo que te permite acceder a otros archivos incluidos:
import os
# Get the base directory of the bundled files
base_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(base_dir, 'config.json')Esto es útil cuando necesitas:
- Acceder a los archivos de configuración incluidos con tu UDF
- Cargar paquetes wheel para dependencias personalizadas
- Incluir scripts adicionales o archivos de datos
Ahora comprime el archivo en un archivo ZIP:
zip is_business_hours.zip main.pyCrear una UDF desde la UI
- En la página principal de Cloud Console, haz clic en el nombre de tu organización en el menú de la esquina inferior izquierda.
- Selecciona Funciones definidas por el usuario en el menú.
- En la página de funciones definidas por el usuario, haz clic en Configurar una UDF. Se abrirá un panel de configuración a la derecha de la pantalla.
- Introduce un nombre para la función. Para este ejemplo, usa
isBusinessHours. - Selecciona un tipo de función: Executable pool o Executable:
- Executable pool: Se mantiene un grupo de procesos persistentes y, para las lecturas, se toma un proceso del grupo.
- Executable: El script se ejecuta en cada consulta.
- Para este ejemplo, usa la configuración predeterminada. Para ver la lista completa de parámetros de configuración, consulta Funciones ejecutables definidas por el usuario.
- Haz clic en Buscar archivo para cargar el archivo
.zipque creaste al inicio de este tutorial. - Añade un argumento nuevo. Para este ejemplo, añade un argumento
timestampde tipoDateTime. - Selecciona un tipo de retorno. Para este ejemplo, selecciona
Bool. - Haz clic en Crear UDF. Un cuadro de diálogo mostrará el estado actual de la compilación.
- Si surge algún problema, el estado cambia a error.
- En caso contrario, el estado pasa de building a provisioning. Tu servicio debe estar activo para completar el aprovisionamiento. Si tu servicio está inactivo, haz clic en Activar servicio en el panel Detalles de la UDF junto al nombre del servicio.
- Cuando se complete, el estado cambia a deployed.
Prueba tu UDF
- vuelve a la página de inicio de la SQL Console haciendo clic en Settings - volver a la vista de tu servicio en la esquina superior izquierda de la página
- haz clic en SQL Console en el menú de la izquierda
- escribe la siguiente consulta:
SELECT isBusinessHours('2026-03-20 10:00:00'::DateTime), isBusinessHours('2026-03-20 23:00:00'::DateTime);Deberías ver el siguiente resultado:
true falseCrear una nueva versión
Para cambiar el código de una UDF, crea una nueva versión. El panel Edit solo gestiona a qué servicios está asignada una UDF; cargar un archivo allí no reemplazará el código desplegado.
- En la página principal de Cloud Console, haz clic en el nombre de tu organización en el menú de la esquina inferior izquierda.
- Selecciona Funciones definidas por el usuario en el menú.
- En Acciones, selecciona los tres puntos de la UDF
isBusinessHoursy haz clic en Crear nueva versión - Sube un archivo ZIP con el código modificado o cambia la configuración y, a continuación, haz clic en Crear nueva versión
Has añadido correctamente tu primera función definida por el usuario a través de la UI, has comprobado que funciona y has visto cómo crear una nueva versión si es necesario.
Administrar UDFs con la Cloud API
Todo lo disponible en la UI también está disponible mediante programación a través de la ClickHouse Cloud API. Los endpoints de UDF permiten automatizar todo el ciclo de vida de una UDF: cargar archivos fuente, crear funciones y versiones, adjuntarlas a servicios y eliminarlas.
El flujo de trabajo habitual para crear y desplegar una UDF mediante la API es:
- Crear una URL de carga para obtener una URL prefirmada para cargar archivos
application/zipy, a continuación, cargar en ella su archivo ZIP. Cada ID de carga solo puede utilizarse para un intento de creación o de versión; solicite una nueva URL de carga al reintentar. - Crear la UDF a partir del archivo cargado, especificando el nombre de la función, el runtime, los argumentos y el tipo de retorno.
- Adjuntar la UDF a un servicio. Si se omite la versión, se adjunta la versión lista más reciente. El servicio debe estar en ejecución; primero se pueden activar los servicios inactivos.
El conjunto completo de endpoints:
| Endpoint | Descripción |
|---|---|
| Crear URL de carga de UDF | Crea una URL prefirmada para cargar archivos application/zip en el ámbito de la organización |
| Crear UDF | Crea una nueva UDF a partir de un archivo cargado |
| Listar UDFs | Devuelve la versión más reciente de cada UDF de la organización |
| Obtener UDF | Devuelve la versión más reciente de una UDF |
| Eliminar UDF | Elimina todas las versiones de una UDF y la desvincula de todos los servicios |
| Crear versión de UDF | Usa un archivo fuente, asigna una versión e inicia la compilación de la UDF |
| Listar versiones de UDF | Devuelve todas las versiones de una UDF |
| Eliminar versión de UDF | Elimina una versión de UDF que no está adjunta a ningún servicio |
| Adjuntar UDF a un servicio | Adjunta una versión de UDF a un servicio y reemplaza la versión actual cuando es necesario |
| Listar asociaciones de UDF | Devuelve las asociaciones actuales de servicios para una UDF |
| Obtener asociación de UDF | Devuelve la asociación actual de una UDF con un servicio |
| Desvincular UDF de un servicio | Desvincula una UDF de un servicio |
Consulte la referencia de la API de UDF para ver los esquemas de solicitud y respuesta.
Administrar UDFs con Terraform
El proveedor de Terraform de ClickHouse oficial incluye dos recursos para administrar UDFs como infraestructura como código:
clickhouse_udfadministra la función propiamente dicha. Recibe un archivo ZIP con el código fuente de la función y publica una nueva versión cada vez que cambia el hash del archivo, esperando a que finalice la compilación.clickhouse_udf_attachmentadjunta una versión de una UDF a un servicio. Un servicio puede tener como máximo una versión de una función a la vez. Puede fijar un número de versión o hacer referencia aclickhouse_udf.<name>.versionpara actualizar automáticamente los servicios a la versión más reciente.
Por ejemplo, para desplegar con Terraform la UDF isBusinessHours del ejemplo anterior:
resource "clickhouse_udf" "is_business_hours" {
function_name = "isBusinessHours"
runtime = "python3.11"
type = "executable_pool"
return_type = "Bool"
arguments = [
{ name = "timestamp", type = "DateTime" },
]
source_archive_path = "${path.module}/is_business_hours.zip"
source_archive_hash = filebase64sha256("${path.module}/is_business_hours.zip")
}
resource "clickhouse_udf_attachment" "production" {
function_name = clickhouse_udf.is_business_hours.function_name
service_id = var.service_id
version = clickhouse_udf.is_business_hours.version
}La vinculación solo se realiza correctamente para las versiones que están listas y puede tardar varios minutos; los servicios inactivos se reactivan automáticamente. Al eliminar un recurso clickhouse_udf, se eliminan todas las versiones de la función y se desvincula de todos los servicios.