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:

UDF, UDTF

JavaScript:

UDF, UDTF

Python:

UDF, UDAF, UDTF, UDF vectorisée, UDTF vectorisée

Scala:

UDF

SQL:

UDF, UDTF

Java, Python, ou Scala

Snowpark API

Sur le client, écrivez le code des opérations qui sont transmises à Snowflake pour traitement.

Java:

UDF, UDTF

Python:

UDF, UDAF, UDTF, UDF vectorisée ou UDTF

Scala:

UDF, UDTF

Interface de ligne de commande

Snowflake CLI

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.

Gestion des objets Snowflake

Python

API Snowflake 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.

Gestion des fonctions définies par l’utilisateur (UDFs)

REST

API REST Snowflake

Effectuez des requêtes auprès des points de terminaison RESTful pour créer et gérer des entités Snowflake.

Gérer les fonctions définies par l’utilisateur

Lorsque vous choisissez un langage, tenez également compte des éléments suivants :

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
$$;
Copy

Le code de l’exemple suivant exécute l’UDF addone.

SELECT addone(3);
Copy

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 :

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.