Executable y ExecutablePool le permiten definir una tabla cuyas filas se generan a partir de un script que usted define (escribiendo filas en stdout). El script ejecutable se almacena en el directorio users_scripts y puede leer datos de cualquier fuente.
- Tablas
Executable: el script se ejecuta para cada consulta - Tablas
ExecutablePool: mantiene un grupo de procesos persistentes y toma procesos de ese grupo para las lecturas
Creación de una tabla Executable
Executable requiere dos parámetros: el nombre del script y el formato de los datos de entrada. Opcionalmente, puede pasar una o más consultas de entrada:
Executable:
send_chunk_header- Descripción: Envía el número de filas de cada fragmento antes de enviarlo para su procesamiento. Esta configuración puede ayudarte a escribir el script de forma más eficiente, preasignando algunos recursos.
- Valor predeterminado: false
command_termination_timeout- Descripción: Tiempo de espera para la finalización del comando, en segundos
- Valor predeterminado: 10
command_read_timeout- Descripción: Tiempo de espera para leer datos de la salida estándar (
stdout) del comando, en milisegundos - Valor predeterminado: 10000
- Descripción: Tiempo de espera para leer datos de la salida estándar (
command_write_timeout- Descripción: Tiempo de espera para escribir datos en la entrada estándar (
stdin) del comando, en milisegundos - Valor predeterminado: 10000
- Descripción: Tiempo de espera para escribir datos en la entrada estándar (
my_script.py y se guarda en la carpeta user_scripts. Lee un número i e imprime i cadenas aleatorias, cada una precedida por un número separado por una tabulación:
my_executable_table se crea a partir de la salida de my_script.py, que generará 10 cadenas aleatorias cada vez que se ejecute un SELECT en my_executable_table:
my_executable_table, se invoca el script:
Pasar resultados de una consulta a un script
nltk) con un SentimentIntensityAnalyzer para determinar si los comentarios son positivos, negativos o neutros, además de asignarles un valor entre -1 (un comentario muy negativo) y 1 (un comentario muy positivo). Vamos a crear una tabla Executable que calcule el sentimiento de los comentarios de Hacker News con nltk.
Este ejemplo usa la tabla hackernews descrita aquí. La tabla hackernews incluye una columna id de tipo UInt64 y una columna String llamada comment. Empecemos definiendo la tabla Executable:
sentiment:
- El archivo
sentiment.pyse guarda en la carpetauser_scripts(la carpeta predeterminada de la configuraciónuser_scripts_path) - El formato
TabSeparatedsignifica que nuestro script de Python debe generar filas de datos sin procesar que contengan valores separados por tabulaciones - La consulta selecciona dos columnas de
hackernews. El script de Python tendrá que extraer los valores de esas columnas de las filas entrantes
sentiment.py:
- Para que esto funcione, deberás ejecutar
nltk.downloader.download('vader_lexicon'). Esto podría haberse incluido en el script, pero entonces se descargaría cada vez que se ejecutara una consulta sobre la tablasentiment, lo cual no es eficiente - Cada valor de
rowcorresponde a una fila del conjunto de resultados deSELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 - La fila de entrada está separada por tabulaciones, así que extraemos el
idy elcommentcon la funciónsplitde Python - El resultado de
polarity_scoreses un objeto JSON con unos cuantos valores. Decidimos simplemente tomar el valorcompoundde este objeto JSON - Ten en cuenta que la tabla
sentimentde ClickHouse usa el formatoTabSeparatedy contiene dos columnas, por lo que nuestra funciónprintsepara esas columnas con una tabulación
sentiment, se ejecuta la consulta SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 y el resultado se pasa a sentiment.py. Vamos a probarlo:
Creación de una tabla ExecutablePool
ExecutablePool es similar a la de Executable, pero hay un par de ajustes relevantes que son exclusivos de una tabla ExecutablePool:
pool_size- Descripción: Tamaño del grupo de procesos. Si el tamaño es 0, no hay restricciones de tamaño.
- Valor predeterminado: 16
max_command_execution_time- Descripción: Tiempo máximo de ejecución del comando, en segundos
- Valor predeterminado: 10
sentiment anterior para usar ExecutablePool en lugar de Executable:
sentiment_pooled.