Saltar al contenido principal
La función de tabla executable crea una tabla a partir de la salida de una función definida por el usuario (UDF) que se define en un script que envía filas a stdout. El script ejecutable se almacena en el directorio users_scripts y puede leer datos de cualquier fuente. Asegúrese de que su servidor ClickHouse tenga todos los paquetes necesarios para ejecutar el script. Por ejemplo, si es un script de Python, asegúrese de que el servidor tenga instalados los paquetes de Python necesarios. Opcionalmente, puede incluir una o más consultas de entrada que transmitan sus resultados a stdin para que el script los lea.
Una ventaja clave de las funciones UDF convencionales frente a la función de tabla executable y el motor de tabla Executable es que las funciones UDF convencionales no pueden cambiar el número de filas. Por ejemplo, si la entrada contiene 100 filas, el resultado debe devolver 100 filas. Al usar la función de tabla executable o el motor de tabla Executable, su script puede realizar cualquier transformación de datos que desee, incluidas agregaciones complejas.

Sintaxis

La función de tabla executable requiere tres parámetros y acepta una lista opcional de consultas de entrada:
executable(script_name, format, structure, [input_query...] [,SETTINGS ...])
  • script_name: el nombre de archivo del script. Se guarda en la carpeta user_scripts (la carpeta predeterminada de la configuración user_scripts_path)
  • format: el formato de la tabla generada
  • structure: el esquema de la tabla generada
  • input_query: una consulta opcional (o una colección o varias consultas) cuyos resultados se pasan al script a través de stdin
Si va a invocar el mismo script repetidamente con las mismas consultas de entrada, considere usar el motor de tabla Executable.
El siguiente script de Python se llama generate_random.py y se guarda en la carpeta user_scripts. Lee un número i y muestra i cadenas aleatorias, cada una precedida por un número separado por una tabulación:
#!/usr/local/bin/python3.9

import sys
import string
import random

def main():

    # Leer el valor de entrada
    for number in sys.stdin:
        i = int(number)

        # Generar algunas filas aleatorias
        for id in range(0, i):
            letters = string.ascii_letters
            random_string =  ''.join(random.choices(letters ,k=10))
            print(str(id) + '\t' + random_string + '\n', end='')

        # Volcar los resultados a stdout
        sys.stdout.flush()

if __name__ == "__main__":
    main()
Ejecutemos el script y hagamos que genere 10 cadenas aleatorias:
SELECT * FROM executable('generate_random.py', TabSeparated, 'id UInt32, random String', (SELECT 10))
La respuesta tiene este aspecto:
┌─id─┬─random─────┐
│  0 │ xheXXCiSkH │
│  1 │ AqxvHAoTrl │
│  2 │ JYvPCEbIkY │
│  3 │ sWgnqJwGRm │
│  4 │ fTZGrjcLon │
│  5 │ ZQINGktPnd │
│  6 │ YFSvGGoezb │
│  7 │ QyMJJZOOia │
│  8 │ NfiyDDhmcI │
│  9 │ REJRdJpWrg │
└────┴────────────┘

Configuración

  • send_chunk_header - controla si se envía el número de filas antes de enviar un fragmento de datos para su procesamiento. El valor predeterminado es false.
  • pool_size — Tamaño del pool. Si se especifica 0 como pool_size, no hay restricciones en el tamaño del pool. El valor predeterminado es 16.
  • max_command_execution_time — Tiempo máximo de ejecución del comando del script ejecutable para procesar un bloque de datos. Se especifica en segundos. El valor predeterminado es 10.
  • command_termination_timeout — el script ejecutable debe contener el bucle principal de lectura y escritura. Después de que se destruye la función de tabla, se cierra la tubería y el ejecutable tendrá command_termination_timeout segundos para finalizar antes de que ClickHouse envíe la señal SIGTERM al proceso hijo. Se especifica en segundos. El valor predeterminado es 10.
  • command_read_timeout - tiempo de espera para leer datos de stdout del comando en milisegundos. El valor predeterminado es 10000.
  • command_write_timeout - tiempo de espera para escribir datos en stdin del comando en milisegundos. El valor predeterminado es 10000.

Pasar los resultados de una consulta a un script

Consulte también el ejemplo del motor de tabla Executable sobre cómo pasar los resultados de una consulta a un script. A continuación se muestra cómo ejecutar el mismo script de ese ejemplo mediante la función de tabla executable:
SELECT * FROM executable(
    'sentiment.py',
    TabSeparated,
    'id UInt64, sentiment Float32',
    (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20)
);
Última modificación el 10 de junio de 2026