Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Funciones definidas por el usuario en Cloud

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:

  1. Mediante SQL
  2. Mediante la UI y su propio código (beta pública)
  3. Mediante la Cloud API (beta)
  4. 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.

  1. Inicie sesión en Cloud Console y abra la consola SQL
  2. 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;
  1. 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
  1. Puede usar el comando DROP FUNCTION para eliminar la UDF que acaba de crear:
DROP FUNCTION isBusinessHours

Esto 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

Funcionalidad beta

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()
EOF

Si 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.0

Empaquetar 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.txt

Puedes 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.py

Crear una UDF desde la UI

  1. 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.
  2. Selecciona Funciones definidas por el usuario en el menú.
  3. 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.
  4. Introduce un nombre para la función. Para este ejemplo, usa isBusinessHours.
  5. 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.
  6. 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.
  7. Haz clic en Buscar archivo para cargar el archivo .zip que creaste al inicio de este tutorial.
  8. Añade un argumento nuevo. Para este ejemplo, añade un argumento timestamp de tipo DateTime.
  9. Selecciona un tipo de retorno. Para este ejemplo, selecciona Bool.
  10. 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

  1. 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
  2. haz clic en SQL Console en el menú de la izquierda
  3. 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    false

Crear 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.

  1. 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.
  2. Selecciona Funciones definidas por el usuario en el menú.
  3. En Acciones, selecciona los tres puntos de la UDF isBusinessHours y haz clic en Crear nueva versión
  4. 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

Funcionalidad beta

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:

  1. Crear una URL de carga para obtener una URL prefirmada para cargar archivos application/zip y, 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.
  2. Crear la UDF a partir del archivo cargado, especificando el nombre de la función, el runtime, los argumentos y el tipo de retorno.
  3. 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

Funcionalidad beta

El proveedor de Terraform de ClickHouse oficial incluye dos recursos para administrar UDFs como infraestructura como código:

  • clickhouse_udf administra 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_attachment adjunta 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 a clickhouse_udf.<name>.version para 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.

Navigation