Passer au contenu principal
La fonction de table executable crée une table à partir de la sortie d’une fonction définie par l’utilisateur (UDF) que vous définissez dans un script qui écrit des lignes sur stdout. Le script exécutable est stocké dans le répertoire users_scripts et peut lire des données à partir de n’importe quelle source. Assurez-vous que votre serveur ClickHouse dispose de tous les paquets nécessaires pour exécuter ce script. Par exemple, s’il s’agit d’un script Python, assurez-vous que les paquets Python requis sont installés sur le serveur. Vous pouvez également inclure une ou plusieurs requêtes d’entrée dont les résultats sont transmis à stdin pour être lus par le script.
L’un des principaux avantages de la fonction de table executable et du moteur de table Executable par rapport aux fonctions UDF classiques est que ces dernières ne peuvent pas modifier le nombre de lignes. Par exemple, si l’entrée contient 100 lignes, le résultat doit également en renvoyer 100. Lorsque vous utilisez la fonction de table executable ou le moteur de table Executable, votre script peut effectuer toutes les transformations de données souhaitées, y compris des agrégations complexes.

Syntaxe

La fonction de table executable nécessite trois paramètres et accepte une liste facultative de requêtes d’entrée :
executable(script_name, format, structure, [input_query...] [,SETTINGS ...])
  • script_name : le nom du fichier du script, enregistré dans le dossier user_scripts (dossier par défaut du paramètre user_scripts_path)
  • format : le format de la table générée
  • structure : le schéma de la table générée
  • input_query : une requête facultative (ou une collection de requêtes) dont les résultats sont transmis au script via stdin
Si vous comptez invoquer plusieurs fois le même script avec les mêmes requêtes d’entrée, envisagez d’utiliser le moteur de table Executable.
Le script Python suivant s’appelle generate_random.py et est enregistré dans le dossier user_scripts. Il lit un nombre i et affiche i chaînes aléatoires, chacune précédée d’un nombre séparé par une tabulation :
#!/usr/local/bin/python3.9

import sys
import string
import random

def main():

    # Read input value
    for number in sys.stdin:
        i = int(number)

        # Generate some random rows
        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='')

        # Flush results to stdout
        sys.stdout.flush()

if __name__ == "__main__":
    main()
Exécutons le script pour générer 10 chaînes aléatoires :
SELECT * FROM executable('generate_random.py', TabSeparated, 'id UInt32, random String', (SELECT 10))
La réponse est la suivante :
┌─id─┬─random─────┐
│  0 │ xheXXCiSkH │
│  1 │ AqxvHAoTrl │
│  2 │ JYvPCEbIkY │
│  3 │ sWgnqJwGRm │
│  4 │ fTZGrjcLon │
│  5 │ ZQINGktPnd │
│  6 │ YFSvGGoezb │
│  7 │ QyMJJZOOia │
│  8 │ NfiyDDhmcI │
│  9 │ REJRdJpWrg │
└────┴────────────┘

Paramètres

  • send_chunk_header - indique s’il faut envoyer le nombre de lignes avant d’envoyer un fragment de données à traiter. La valeur par défaut est false.
  • pool_size — Taille du pool. Si pool_size vaut 0, il n’y a aucune restriction sur la taille du pool. La valeur par défaut est 16.
  • max_command_execution_time — Temps d’exécution maximal de la commande du script exécutable pour le traitement d’un bloc de données. Exprimé en secondes. La valeur par défaut est 10.
  • command_termination_timeout — le script exécutable doit contenir une boucle principale de lecture-écriture. Après la destruction de la fonction de table, le pipe est fermé et le fichier exécutable dispose de command_termination_timeout secondes pour s’arrêter avant que ClickHouse n’envoie le signal SIGTERM au processus enfant. Exprimé en secondes. La valeur par défaut est 10.
  • command_read_timeout - délai d’expiration pour la lecture des données depuis le stdout de la commande, en millisecondes. La valeur par défaut est 10000.
  • command_write_timeout - délai d’expiration pour l’écriture des données vers le stdin de la commande, en millisecondes. La valeur par défaut est 10000.

Transmettre les résultats de la requête à un script

N’oubliez pas de consulter l’exemple du moteur de table Executable expliquant comment transmettre les résultats de la requête à un script. Voici comment exécuter le même script que dans cet exemple à l’aide de la fonction de table executable :
SELECT * FROM executable(
    'sentiment.py',
    TabSeparated,
    'id UInt64, sentiment Float32',
    (SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20)
);
Dernière modification le 25 juin 2026