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.
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 dossieruser_scripts(dossier par défaut du paramètreuser_scripts_path)format: le format de la table généréestructure: le schéma de la table généréeinput_query: une requête facultative (ou une collection de requêtes) dont les résultats sont transmis au script via stdin
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 estfalse.pool_size— Taille du pool. Sipool_sizevaut 0, il n’y a aucune restriction sur la taille du pool. La valeur par défaut est16.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 decommand_termination_timeoutsecondes 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)
);