> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

# executable

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.

<Note>
  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.
</Note>

<div id="syntax">
  ## Sintaxis
</div>

La función de tabla `executable` requiere tres parámetros y acepta una lista opcional de consultas de entrada:

```sql theme={null}
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**

<Note>
  Si va a invocar el mismo script repetidamente con las mismas consultas de entrada, considere usar el [motor de tabla `Executable`](/es/reference/engines/table-engines/special/executable).
</Note>

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:

```python theme={null}
#!/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:

```sql theme={null}
SELECT * FROM executable('generate_random.py', TabSeparated, 'id UInt32, random String', (SELECT 10))
```

La respuesta tiene este aspecto:

```response theme={null}
┌─id─┬─random─────┐
│  0 │ xheXXCiSkH │
│  1 │ AqxvHAoTrl │
│  2 │ JYvPCEbIkY │
│  3 │ sWgnqJwGRm │
│  4 │ fTZGrjcLon │
│  5 │ ZQINGktPnd │
│  6 │ YFSvGGoezb │
│  7 │ QyMJJZOOia │
│  8 │ NfiyDDhmcI │
│  9 │ REJRdJpWrg │
└────┴────────────┘
```

<div id="settings">
  ## Configuración
</div>

* `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.

<div id="passing-query-results-to-a-script">
  ## Pasar los resultados de una consulta a un script
</div>

Consulte también el ejemplo del motor de tabla `Executable` sobre [cómo pasar los resultados de una consulta a un script](/es/reference/engines/table-engines/special/executable#passing-query-results-to-a-script). A continuación se muestra cómo ejecutar el mismo script de ese ejemplo mediante la función de tabla `executable`:

```sql theme={null}
SELECT * FROM executable(
    'sentiment.py',
    TabSeparated,
    'id UInt64, sentiment Float32',
    (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20)
);
```
