Passer au contenu principal

UDFs Fonctions définies par l’utilisateur

ClickHouse prend en charge plusieurs types de fonctions définies par l’utilisateur (UDFs) :
  • Executable UDFs lancent un programme externe ou un script (Python, Bash, etc.) et lui transmettent des blocs de données en flux via STDIN / STDOUT. Utilisez-les pour intégrer du code ou des outils existants sans recompiler ClickHouse. Leur surcoût par appel est plus élevé que celui des options exécutées dans le processus, et elles conviennent mieux à une logique plus lourde ou aux cas où un environnement d’exécution différent est nécessaire.
  • SQL UDFs sont définies avec CREATE FUNCTION uniquement en SQL. Elles sont intégrées/dépliées dans le plan de requête (sans passer par un processus distinct), ce qui les rend légères et idéales pour réutiliser une logique d’expression ou simplifier des colonnes calculées complexes.
  • Experimental WebAssembly UDFs exécutent du code compilé en WebAssembly dans un sandbox au sein du processus serveur. Elles offrent un surcoût par appel plus faible que les exécutables externes, avec une meilleure isolation que les extensions natives, ce qui les rend adaptées aux algorithmes personnalisés écrits dans des langages pouvant cibler WASM (par ex. C/C++/Rust).

Fonctions exécutables définies par l’utilisateur

Cette fonctionnalité est disponible en aperçu privé dans ClickHouse Cloud. Veuillez contacter ClickHouse Support à l’adresse https://clickhouse.cloud/support pour y accéder.
ClickHouse peut appeler n’importe quel programme exécutable externe ou script pour traiter les données. La configuration des fonctions exécutables définies par l’utilisateur peut être stockée dans un ou plusieurs fichiers XML. Le chemin d’accès à la configuration est spécifié dans le paramètre user_defined_executable_functions_config. Une configuration de fonction contient les paramètres suivants : La commande doit lire les arguments depuis STDIN et écrire le résultat sur STDOUT. Elle doit traiter les arguments de manière itérative. Autrement dit, après avoir traité un fragment d’arguments, elle doit attendre le fragment suivant.

Fonctions exécutables définies par l’utilisateur

Exemples

UDF à partir d’un script intégré

Créez manuellement test_function_sum en définissant execute_direct sur 0, à l’aide d’une configuration XML ou YAML.
Fichier test_function.xml (/etc/clickhouse-server/test_function.xml avec la configuration de chemin par défaut).
/etc/clickhouse-server/test_function.xml

Query
Result

UDF à partir d’un script Python

Dans cet exemple, nous créons une UDF qui lit une valeur sur STDIN et la renvoie sous forme de chaîne de caractères. Créez test_function à l’aide d’une configuration XML ou YAML.
Fichier test_function.xml (/etc/clickhouse-server/test_function.xml avec le chemin par défaut).
/etc/clickhouse-server/test_function.xml

Créez un fichier script test_function.py dans le dossier user_scripts (/var/lib/clickhouse/user_scripts/test_function.py avec le chemin par défaut).
Query
Result

Lire deux valeurs à partir de STDIN et renvoyer leur somme sous forme d’objet JSON

Créez test_function_sum_json avec des arguments nommés et le format JSONEachRow à l’aide d’une configuration XML ou YAML.
Fichier test_function.xml (/etc/clickhouse-server/test_function.xml avec les paramètres de chemin par défaut).
/etc/clickhouse-server/test_function.xml

Créez le fichier de script test_function_sum_json.py dans le dossier user_scripts (/var/lib/clickhouse/user_scripts/test_function_sum_json.py avec les paramètres de chemin par défaut).
Query
Result

Utiliser des paramètres dans le paramètre command

Les fonctions définies par l’utilisateur exécutables peuvent accepter des paramètres constants configurés dans le paramètre command (cela fonctionne uniquement pour les fonctions définies par l’utilisateur de type executable). Cela nécessite également l’option execute_direct pour éviter toute vulnérabilité liée à l’expansion des arguments par le shell.
Fichier test_function_parameter_python.xml (/etc/clickhouse-server/test_function_parameter_python.xml avec les chemins par défaut).
/etc/clickhouse-server/test_function_parameter_python.xml

Créez le script test_function_parameter_python.py dans le dossier user_scripts (/var/lib/clickhouse/user_scripts/test_function_parameter_python.py avec les chemins par défaut).
Query
Result

UDF à partir d’un script shell

Dans cet exemple, nous créons un script shell qui multiplie chaque valeur par 2.
Fichier test_function_shell.xml (/etc/clickhouse-server/test_function_shell.xml si vous utilisez les chemins par défaut).
/etc/clickhouse-server/test_function_shell.xml

Créez le fichier de script test_shell.sh dans le dossier user_scripts (/var/lib/clickhouse/user_scripts/test_shell.sh si vous utilisez les chemins par défaut).
/var/lib/clickhouse/user_scripts/test_shell.sh
Query
Result

Gestion des erreurs

Certaines fonctions peuvent lever une exception si les données sont non valides. Dans ce cas, la requête est annulée et un message d’erreur est renvoyé au client. Pour le traitement distribué, lorsqu’une exception se produit sur l’un des serveurs, les autres serveurs tentent également d’interrompre la requête.

Évaluation des expressions des arguments

Dans presque tous les langages de programmation, il arrive que, pour certains opérateurs, l’un des arguments ne soit pas évalué. Il s’agit généralement des opérateurs &&, || et ?:. Dans ClickHouse, les arguments des fonctions (opérateurs) sont toujours évalués. Cela s’explique par le fait que des parties entières de colonnes sont évaluées en une seule fois, au lieu de calculer chaque ligne séparément.

Exécution des fonctions pour le traitement distribué des requêtes

Pour le traitement distribué des requêtes, autant d’étapes du traitement des requêtes que possible sont exécutées sur des serveurs distants, et les étapes restantes (fusion des résultats intermédiaires et tout ce qui suit) sont exécutées sur le serveur à l’origine de la requête. Cela signifie que les fonctions peuvent être exécutées sur différents serveurs. Par exemple, dans la requête SELECT f(sum(g(x))) FROM distributed_table GROUP BY h(y),
  • si distributed_table a au moins deux shards, les fonctions ‘g’ et ‘h’ sont exécutées sur des serveurs distants, et la fonction ‘f’ est exécutée sur le serveur à l’origine de la requête.
  • si distributed_table n’a qu’un seul shard, toutes les fonctions ‘f’, ‘g’ et ‘h’ sont exécutées sur le serveur de ce shard.
Le résultat d’une fonction ne dépend généralement pas du serveur sur lequel elle est exécutée. Cependant, cela peut parfois avoir de l’importance. Par exemple, les fonctions qui utilisent des dictionnaires s’appuient sur le dictionnaire présent sur le serveur où elles s’exécutent. Autre exemple : la fonction hostName, qui renvoie le nom du serveur sur lequel elle s’exécute, afin de permettre un GROUP BY par serveurs dans une requête SELECT. Si une fonction d’une requête est exécutée sur le serveur à l’origine de la requête, mais que vous devez l’exécuter sur des serveurs distants, vous pouvez l’encapsuler dans une fonction d’agrégation ‘any’ ou l’ajouter à une clé du GROUP BY.

SQL User Defined Functions

Des fonctions personnalisées à partir d’expressions lambda peuvent être créées à l’aide de l’instruction CREATE FUNCTION. Pour supprimer ces fonctions, utilisez l’instruction DROP FUNCTION.

WebAssembly User Defined Functions

Les WebAssembly User Defined Functions (WASM UDFs) permettent d’exécuter du code personnalisé compilé en WebAssembly au sein du processus du serveur ClickHouse.

Démarrage rapide

Activez la prise en charge expérimentale de WebAssembly dans la configuration de ClickHouse :
Insérez votre module WASM compilé dans la table système :
Créez une fonction à l’aide de votre module WASM :
Utilisez la fonction dans vos requêtes :

Informations complémentaires

Pour en savoir plus, consultez la documentation sur WebAssembly User Defined Functions.
Dernière modification le 2 juillet 2026