Vue d’ensemble des fonctions définies par l’utilisateur¶
Vous pouvez écrire des fonctions définies par l’utilisateur (UDFs) pour étendre le système pour effectuer des opérations qui ne sont pas disponibles grâce aux fonctions intégrées et définies par le système fournies par Snowflake. Une fois que vous avez créé une UDF, vous pouvez la réutiliser plusieurs fois. Une fonction renvoie toujours une valeur explicitement en spécifiant une expression, c’est donc un bon choix pour calculer et renvoyer une valeur.
Vous pouvez utiliser des UDFs pour étendre les fonctions intégrées ou pour encapsuler des calculs standard pour votre organisation. Les UDFs que vous créez peuvent être appelées de la même manière que les fonctions intégrées.
Vous écrivez la logique d’une UDF (son gestionnaire) dans l’un des langages pris en charge. Une fois que vous avez un gestionnaire, vous pouvez créer une UDF à l’aide de l’un des outils inclus dans Snowflake, puis exécuter l’UDF.
Une UDF ressemble à une procédure stockée, mais les deux diffèrent sur des points importants. Pour plus d’informations, voir Choisir d’écrire une procédure stockée ou une fonction définie par l’utilisateur.
Une UDF n’est qu’une façon d’étendre Snowflake. Pour les autres, voir ce qui suit :
Variations de fonctions définies par l’utilisateur¶
Vous pouvez écrire une UDF dans une ou plusieurs variantes, en fonction des exigences d’entrée et de sortie auxquelles votre fonction doit répondre.
Variation |
Description |
---|---|
Fonction définie par l’utilisateur (UDF) |
Également connue sous le nom de fonction scalaire, elle renvoie une ligne de sortie pour chaque ligne d’entrée. La ligne renvoyée est constituée d’une seule colonne/valeur. |
Fonction agrégée définie par l’utilisateur (UDAF) |
Opère sur des valeurs réparties sur plusieurs lignes pour effectuer des performances mathématiques telles que la somme, la moyenne, le comptage, la recherche de valeurs minimales ou maximales, l’écart type et l’estimation, ainsi que certaines opérations non mathématiques. |
Fonction de table définie par l’utilisateur (UDTF) |
Renvoie une valeur de tableau pour chaque ligne d’entrée. |
Fonction définie par l’utilisateur vectorisée (UDF) |
Recevez des lots de lignes en entrée sous forme de DataFrames Pandas et renvoyez des lots de résultats sous forme de tableaux ou de séries Pandas. |
Fonction de table définie par l’utilisateur vectorisée (UDTF) |
Recevez des lots de lignes d’entrée sous la forme de DataFrames Pandas et renvoyez les résultats sous forme de tableau. |
Langages et outils pris en charge¶
Vous pouvez créer et gérer des UDFs (et d’autres entités Snowflake) à l’aide de plusieurs outils, selon votre méthode de travail.
Langage |
Approche |
Assistance |
---|---|---|
SQL Avec un gestionnaire en Java, JavaScript, Python, Scala, ou SQL |
Écrivez le code SQL dans Snowflake pour créer et gérer des entités Snowflake. Rédigez la logique de la fonction dans l’un des langages de gestionnaire pris en charge. |
|
Java, Python, ou Scala |
Sur le client, écrivez le code des opérations qui sont transmises à Snowflake pour traitement. |
|
Interface de ligne de commande |
Utilisez la ligne de commande pour créer et gérer des entités Snowflake, en spécifiant des propriétés en tant que propriétés d’objets JSON. |
|
Python |
Sur le client, exécutez les commandes pour créer la fonction avec Python, en écrivant le gestionnaire de la fonction dans l’un des langages de gestionnaire pris en charge. |
|
REST |
Effectuez des requêtes auprès des points de terminaison RESTful pour créer et gérer des entités Snowflake. |
Lorsque vous choisissez un langage, tenez également compte des éléments suivants :
Emplacements du gestionnaire pris en charge. Tous les langages ne permettent pas de faire référence au gestionnaire sur une zone de préparation (le code du gestionnaire doit être en ligne). Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.
Si le gestionnaire produit une UDF qui peut être partagée. Une UDF partageable peut être utilisée avec la fonctionnalité Secure Data Sharing de Snowflake.
Langage |
Emplacement du gestionnaire |
Partageable |
---|---|---|
Java |
En ligne ou en zone de préparation |
Non [1] |
JavaScript |
En ligne |
Oui |
Python |
En ligne ou en zone de préparation |
Non [2] |
Scala |
En ligne ou en zone de préparation |
Non [3] |
SQL |
En ligne |
Oui |
Considérations¶
Si une requête appelle une UDF pour accéder à des fichiers en zone de préparation, l’opération échoue avec une erreur utilisateur si l’instruction SQL interroge également une vue qui appelle une UDF ou une UDTF, peu importe si la fonction de la vue accède ou non à des fichiers en zone de préparation.
Les UDTFs peuvent traiter plusieurs fichiers en parallèle ; cependant, les UDFs traitent actuellement les fichiers en série. Comme solution de rechange, regroupez les lignes dans une sous-requête en utilisant la clause GROUP BY. Voir Traiter un fichier CSV avec une UDTF pour un exemple.
Actuellement, si les fichiers en zone de préparation référencés dans une requête sont modifiés ou supprimés pendant l’exécution de la requête, l’appel de la fonction renvoie une erreur.
Si vous spécifiez la fonction CURRENT_DATABASE ou CURRENT_SCHEMA dans le code de gestionnaire (handler) de l’UDF, la fonction renvoie la base de données ou le schéma contenant l’UDF et non la base de données ou le schéma utilisé pour la session.
Exemple UDF¶
Le code de l’exemple suivant crée une UDF appelée addone
avec un gestionnaire écrit en Python. La fonction du gestionnaire est addone_py
. Cette UDF renvoie un int
.
CREATE OR REPLACE FUNCTION addone(i int)
RETURNS INT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
HANDLER = 'addone_py'
as
$$
def addone_py(i):
return i+1
$$;
Le code de l’exemple suivant exécute l’UDF addone
.
SELECT addone(3);
Lignes directrices et contraintes¶
- Contraintes liées à Snowflake:
Vous pouvez assurer la stabilité de l’environnement Snowflake en vous développant dans le cadre des contraintes de Snowflake. Pour plus d’informations, consultez Concevoir des gestionnaires qui respectent les contraintes imposées par Snowflake.
- Nommage:
Veillez à nommer les fonctions de manière à éviter les collisions avec d’autres fonctions. Pour plus d’informations, consultez Nommage et surcharge de procédures et d’UDFs.
- Arguments:
Spécifiez les arguments et indiquez ceux qui sont facultatifs. Pour plus d’informations, consultez Définition des arguments pour UDFs et les procédures stockées.
- Mappages de types de données:
Pour chaque langage de traitement, il existe un ensemble distinct de mappages entre les types de données du langage et les types SQL utilisés pour les arguments et les valeurs de retour. Pour plus d’informations sur les mappages pour chaque langage, voir Mappage des types de données entre SQL et les langages de traitement.
Écriture du gestionnaire¶
- Langues du gestionnaire:
Pour du contenu spécifique à une langage sur l’écriture d’un gestionnaire, voir Langages et outils pris en charge.
- Accès au réseau externe:
Vous pouvez accéder aux emplacements réseau externes avec un accès au réseau externe. Vous pouvez créer un accès sécurisé à des emplacements réseau spécifiques externes à Snowflake, puis utiliser cet accès à partir du code du gestionnaire.
- Journalisation, traçage et métriques:
Vous pouvez enregistrer l’activité du code en capturant les messages du journal, les événements de trace et les données de mesure, en stockant les données dans une base de données que vous pouvez interroger ultérieurement.
Sécurité¶
Vous pouvez accorder des privilèges aux objets nécessaires pour qu’ils effectuent des actions SQL spécifiques avec une UDF ou une UDTF. Pour plus d’informations, voir Accorder des privilèges pour les fonctions définies par l’utilisateur
Les fonctions partagent certains problèmes de sécurité avec les procédures stockées. Pour plus d’informations, voir ci-dessous :
Vous pouvez aider le code du gestionnaire d’une procédure à s’exécuter en toute sécurité en suivant les bonnes pratiques décrites dans la section Pratiques de sécurité pour UDFs et procédures
Veillez à ce que les informations sensibles soient dissimulées aux utilisateurs qui ne devraient pas y avoir accès. Pour plus d’informations, voir Protection des informations sensibles avec les UDFs et les procédures stockées sécurisées
Déploiement du code du gestionnaire¶
Lors de la création d’une fonction, vous pouvez spécifier son gestionnaire (qui met en œuvre la logique de la fonction) sous forme de copie en ligne avec la définition de la fonction ou sous forme de code externe à la définition, tel que du code mis en paquet et copié dans une zone externe.
Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.