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.
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 carpetauser_scripts(la carpeta predeterminada de la configuraciónuser_scripts_path)format: el formato de la tabla generadastructure: el esquema de la tabla generadainput_query: una consulta opcional (o una colección o varias consultas) cuyos resultados se pasan al script a través de stdin
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 esfalse.pool_size— Tamaño del pool. Si se especifica 0 comopool_size, no hay restricciones en el tamaño del pool. El valor predeterminado es16.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_timeoutsegundos 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)
);