Executable et ExecutablePool vous permettent de définir une table dont les lignes sont générées à partir d’un script que vous définissez (en écrivant des lignes sur stdout). Le script exécutable est stocké dans le répertoire user_scripts et peut lire des données à partir de n’importe quelle source.
- Tables
Executable: le script est exécuté à chaque requête - Tables
ExecutablePool: maintiennent un pool de processus persistants et y puisent des processus pour les lectures
Création d’une table Executable
Executable nécessite deux paramètres : le nom du script et le format des données entrantes. Vous pouvez également transmettre une ou plusieurs requêtes d’entrée :
Executable :
send_chunk_header- Description : envoie le nombre de lignes dans chaque chunk avant d’envoyer un chunk à traiter. Ce paramètre peut vous aider à écrire votre script plus efficacement en préallouant certaines ressources
- Valeur par défaut : false
command_termination_timeout- Description : délai d’expiration de fin de commande, en secondes
- Valeur par défaut : 10
command_read_timeout- Description : délai d’expiration pour la lecture des données depuis le stdout de la commande, en millisecondes
- Valeur par défaut : 10000
command_write_timeout- Description : délai d’expiration pour l’écriture des données vers le stdin de la commande, en millisecondes
- Valeur par défaut : 10000
my_script.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 :
my_executable_table ci-dessous est construite à partir de la sortie de my_script.py, qui génère 10 chaînes aléatoires chaque fois que vous exécutez un SELECT sur my_executable_table :
my_executable_table, le script est invoqué :
Transmettre les résultats d’une requête à un script
nltk) avec un SentimentIntensityAnalyzer permettant de déterminer si les commentaires sont positifs, négatifs ou neutres, notamment en leur attribuant une valeur comprise entre -1 (un commentaire très négatif) et 1 (un commentaire très positif). Créons une table Executable qui calcule le sentiment des commentaires Hacker News à l’aide de nltk.
Cet exemple utilise la table hackernews décrite ici. La table hackernews comprend une colonne id de type UInt64 et une colonne comment de type String. Commençons par définir la table Executable :
sentiment :
- Le fichier
sentiment.pyest placé dans le dossieruser_scripts(le dossier par défaut du paramètreuser_scripts_path) - Le format
TabSeparatedsignifie que notre script Python doit générer des lignes de données brutes contenant des valeurs séparées par des tabulations - La requête sélectionne deux colonnes de
hackernews. Le script Python devra extraire les valeurs de ces colonnes des lignes entrantes
sentiment.py :
- Pour que cela fonctionne, vous devrez exécuter
nltk.downloader.download('vader_lexicon'). Nous aurions pu l’inclure dans le script, mais il serait alors téléchargé chaque fois qu’une requête serait exécutée sur la tablesentiment, ce qui n’est pas efficace - Chaque valeur de
rowcorrespond à une ligne du result set deSELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 - La ligne reçue est séparée par des tabulations ; nous extrayons donc
idetcommentà l’aide de la fonction Pythonsplit - Le résultat de
polarity_scoresest un objet JSON contenant quelques values. Nous avons choisi de récupérer simplement la valuecompoundde cet objet JSON - N’oubliez pas que la table
sentimentdans ClickHouse utilise le formatTabSeparatedet contient deux colonnes ; notre fonctionprintsépare donc ces colonnes par une tabulation
sentiment, la requête SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20 est exécutée et son résultat est transmis à sentiment.py. Testons cela :
Création d’une table ExecutablePool
ExecutablePool est similaire à celle de Executable, mais quelques paramètres propres à une table ExecutablePool sont à noter :
pool_size- Description : Taille du pool de processus. Si cette taille est de 0, aucune limite de taille n’est appliquée
- Valeur par défaut : 16
max_command_execution_time- Description : Durée maximale d’exécution de la commande, en secondes
- Valeur par défaut : 10
sentiment ci-dessus pour qu’elle utilise ExecutablePool au lieu de Executable :
sentiment_pooled.