CrĂ©er une fonction dĂ©finie par l’utilisateur¶

Vous pouvez crĂ©er une fonction dĂ©finie par l’utilisateur (UDF) en utilisant l’une des mĂ©thodes disponibles avec Snowflake. Ces mĂ©thodes sont dĂ©crites dans cette rubrique.

Créer une UDF¶

  1. Écrivez la logique d’une fonction en tant que gestionnaire à l’aide de l’un des langages pris en charge, notamment Python, Java et Scala.

  2. Choisissez un outil ou une API pour créer la fonction avec le gestionnaire que vous avez écrit.

    Pour plus d’informations sur chacun de ces Ă©lĂ©ments, voir Outils de crĂ©ation d’UDFs.

    SQL

    Utilisez SQL et écrivez la logique dans un ou plusieurs langages.

    Snowpark

    Utilisez l’API Snowpark pour Java, Python ou Scala.

    Ligne de commande

    Exécutez les commandes CLI pour créer la fonction.

    Python API

    Exécutez les commandes Python cÎté client pour créer la fonction.

    REST

    Adressez des requĂȘtes Ă  l’API RESTful pour crĂ©er la fonction.

  3. ExĂ©cutez la fonction Ă  l’aide de l’un des outils suivants, selon vos besoins.

Outils de crĂ©ation d’UDFs¶

Vous pouvez crĂ©er une UDF en utilisant l’une des mĂ©thodes disponibles avec Snowflake, en fonction du langage et de l’ensemble des paramĂštres dont vous disposez. Choisissez l’outil qui correspond Ă  vos besoins dans la table suivante.

Langage

Approche

SQL

ExĂ©cutez une commande SQL, par exemple en utilisant l”Snowsight.

ExĂ©cutez la commande SQL CREATE FUNCTION pour crĂ©er une fonction avec un code gestionnaire Ă©crit dans l’un des langages suivants :

Java, Python ou Scala avec Snowpark

Écrivez du code dans l’un des langages pris en charge, puis exĂ©cutez le code localement pour effectuer des opĂ©rations dans Snowflake.

ExĂ©cutez le code client qui utilise les APIs Snowpark dans l’un des langages suivants.

Ligne de commande

Créez et gérez des entités Snowflake en exécutant des commandes à partir de la ligne de commande.

Exécutez des commandes de la CLI Snowflake.

Python

Sur le client, écrivez du code qui exécute des opérations de gestion sur Snowflake.

ExĂ©cutez du code qui utilise l’API Snowflake Python.

APIs RESTful (indépendantes du langage)

Effectuez des requĂȘtes auprĂšs des points de terminaison RESTful pour crĂ©er et gĂ©rer des entitĂ©s Snowflake.

Faites une requĂȘte pour crĂ©er une procĂ©dure Ă  l’aide de l”API REST Snowflake

Propriétés clés¶

Les paragraphes suivants dĂ©crivent certaines des propriĂ©tĂ©s requises ou gĂ©nĂ©ralement utilisĂ©es lors de la crĂ©ation d’une fonction.

Nom de la fonction:

Le nom de la fonction ne doit pas nĂ©cessairement correspondre au nom du gestionnaire. Pour plus d’informations sur les contraintes et les conventions relatives aux noms, voir Nommage et surcharge de procĂ©dures et d’UDFs.

Arguments:

Pour plus d’informations sur les exigences, voir DĂ©finition des arguments pour UDFs et les procĂ©dures stockĂ©es.

Type de retour:

Pour plus d’informations sur la façon dont Snowflake fait correspondre les types de donnĂ©es SQL aux types de donnĂ©es des gestionnaires, voir Mappage des types de donnĂ©es entre SQL et les langages de traitement.

Nom du gestionnaire:

Si nĂ©cessaire, il s’agit du nom de la classe ou de la mĂ©thode contenant le code qui s’exĂ©cute lorsque la fonction est exĂ©cutĂ©e. Vous devez spĂ©cifier un nom de gestionnaire uniquement pour les gestionnaires Ă©crits en Java, Python et Scala. Pour les gestionnaires JavaScript et SQL, tout le code spĂ©cifiĂ© en ligne sera exĂ©cutĂ© comme le gestionnaire.

Dépendances:

Pour un gestionnaire Ă©crit en Java, Python ou Scala, vous devrez peut-ĂȘtre aussi spĂ©cifier la bibliothĂšque Snowpark, par exemple lors de la crĂ©ation de la fonction.

Pour plus d’informations sur la mise Ă  disposition des dĂ©pendances pour votre gestionnaire, voir Mettre les dĂ©pendances Ă  la disposition de votre code.

Environnement d’exĂ©cution du langage du gestionnaire:

Lorsque le langage du gestionnaire est Java, Python ou Scala, spĂ©cifiez la version d’exĂ©cution pour indiquer la version d’environnement d’exĂ©cution prise en charge Ă  utiliser. Gardez Ă  l’esprit que si vous utilisez la version par dĂ©faut, celle-ci Ă©voluera au fil du temps.

Exigences en matiĂšre de contrĂŽle d’accĂšs¶

Un rĂŽle utilisĂ© pour exĂ©cuter cette opĂ©ration doit au minimum disposer des privilĂšges suivants :

PrivilĂšge

Objet

Remarques

CREATE FUNCTION

Schéma

Le privilĂšge permet uniquement la crĂ©ation de fonctions dĂ©finies par l’utilisateur dans le schĂ©ma.

Si vous souhaitez activer la création de fonctions de mesure de données, le rÎle doit avoir le privilÚge CREATE DATA METRIC FUNCTION.

USAGE

Fonction

Accorder le privilĂšge USAGE Ă  un rĂŽle sur la fonction nouvellement créée permet aux utilisateurs ayant ce rĂŽle d’appeler la fonction ailleurs dans Snowflake (comme le rĂŽle du propriĂ©taire de la politique de masquage pour la tokĂ©nisation externe).

USAGE

IntĂ©gration de l’accĂšs externe

Requis pour les intĂ©grations, s’il y en a, spĂ©cifiĂ©es par le paramĂštre EXTERNAL_ACCESS_INTEGRATIONS. Pour plus d’informations, consultez CREATE EXTERNAL ACCESS INTEGRATION.

READ

Secret

Requis pour les secrets, s’il y en a, spĂ©cifiĂ©s par le paramĂštre SECRETS. Pour plus d’informations, voir CrĂ©ation d’un secret pour reprĂ©senter les identifiants de connexion et Utilisation de l’intĂ©gration de l’accĂšs externe dans une fonction ou une procĂ©dure.

USAGE

Schéma

Obligatoire pour les schĂ©mas contenant des secrets, s’il y en a, spĂ©cifiĂ©s par le paramĂštre SECRETS. Pour plus d’informations, voir CrĂ©ation d’un secret pour reprĂ©senter les identifiants de connexion et Utilisation de l’intĂ©gration de l’accĂšs externe dans une fonction ou une procĂ©dure.

Le privilĂšge USAGE relatif Ă  la base de donnĂ©es et au schĂ©ma parents est exigĂ© pour effectuer des opĂ©rations sur tout objet d’un schĂ©ma.

Pour obtenir des instructions sur la crĂ©ation d’un rĂŽle personnalisĂ© avec un ensemble spĂ©cifique de privilĂšges, voir CrĂ©ation de rĂŽles personnalisĂ©s.

Pour des informations gĂ©nĂ©rales sur les rĂŽles et les privilĂšges accordĂ©s pour effectuer des actions SQL sur des objets sĂ©curisables, voir Aperçu du contrĂŽle d’accĂšs.

Notes sur l’utilisation¶

Les notes sur l’utilisation dĂ©crivent les langages pris en charge pour l’écriture des gestionnaires. Bien que les notes des sections suivantes fassent rĂ©fĂ©rence aux clauses de la commande SQL CREATE FUNCTION, ces clauses sont gĂ©nĂ©ralement reprĂ©sentĂ©es d’une autre maniĂšre dans d’autres outils que vous pouvez utiliser pour crĂ©er des fonctions.

Toutes les langues¶

  • function_definition a des restrictions de taille. La taille maximale permise est sujette Ă  changement.

  • Les dĂ©limiteurs autour de la function_definition peuvent ĂȘtre des guillemets simples ou une paire de signes dollar.

    L’utilisation de $$ comme dĂ©limiteur facilite l’écriture des fonctions stockĂ©es contenant des guillemets simples.

    Si le dĂ©limiteur du corps de la fonction est le caractĂšre guillemet simple, tous les guillemets simples dans function_definition (comme les littĂ©raux de chaĂźnes) doivent ĂȘtre Ă©chappĂ©s par des guillemets simples.

  • Si vous utilisez une UDF dans une politique de masquage, assurez-vous que le type de donnĂ©es de la colonne, l’UDF, et la politique de masquage correspondent. Pour plus d’informations, voir Fonctions dĂ©finies par l’utilisateur dans une politique de masquage.

  • 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.

  • Concernant les mĂ©tadonnĂ©es :

    Attention

    Les clients doivent s’assurer qu’aucune donnĂ©e personnelle (autre que pour un objet utilisateur), donnĂ©e sensible, donnĂ©e Ă  exportation contrĂŽlĂ©e ou autre donnĂ©e rĂ©glementĂ©e n’est saisie comme mĂ©tadonnĂ©e lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de mĂ©tadonnĂ©es dans Snowflake.

  • Les clauses OR REPLACE et IF NOT EXISTS s’excluent mutuellement. Elles ne peuvent pas ĂȘtre utilisĂ©es dans la mĂȘme instruction.

  • Les instructions CREATE OR REPLACE <objet> sont atomiques. En d’autres termes, lorsqu’un objet est remplacĂ©, l’ancien objet est supprimĂ© et le nouvel objet est créé dans une seule transaction.

Java¶

  • En Java, les types de donnĂ©es primitifs n’autorisent pas les valeurs NULL. Ainsi, transmettre une valeur NULL pour un argument d’un tel type entraĂźne une erreur.

  • Dans la clause HANDLER, le nom de la mĂ©thode est sensible Ă  la casse.

  • Dans les clauses IMPORTS et TARGET_PATH :

    • Les noms de paquet, de classe et de fichier sont sensibles Ă  la casse.

    • Le(s) nom(s) de zone de prĂ©paration sont insensibles Ă  la casse.

  • Vous pouvez utiliser la clause PACKAGES pour spĂ©cifier les noms et les numĂ©ros de version du paquet pour les dĂ©pendances Snowflake dĂ©finies par le systĂšme, comme celles de Snowpark. Pour les autres dĂ©pendances, spĂ©cifiez les fichiers JAR de dĂ©pendance avec la clause IMPORTS.

  • Snowflake valide ceci :

    • Le fichier JAR spĂ©cifiĂ© dans le HANDLER de l’instruction CREATE FUNCTION existe et contient la classe et la mĂ©thode spĂ©cifiĂ©es.

    • Les types d’entrĂ©e et de sortie spĂ©cifiĂ©s dans la dĂ©claration UDF sont compatibles avec les types d’entrĂ©e et de sortie de la mĂ©thode Java.

    La validation peut se faire au moment de la crĂ©ation ou de l’exĂ©cution, selon que vous ĂȘtes connectĂ© ou non Ă  un entrepĂŽt Snowflake actif.

    • Au moment de la crĂ©ation — Si vous ĂȘtes connectĂ© Ă  un entrepĂŽt Snowflake actif au moment de l’exĂ©cution de l’instruction CREATE FUNCTION, l’UDF est validĂ©e au moment de la crĂ©ation.

    • Au moment de l’exĂ©cution — Si vous n’ĂȘtes pas connectĂ© Ă  un entrepĂŽt Snowflake actif, l’UDF est créée, mais n’est pas validĂ©e immĂ©diatement, et Snowflake renvoie le message suivant :

      Function <nom> created successfully, but could not be validated since there is no active warehouse.

JavaScript¶

  • Snowflake ne valide pas le code JavaScript au moment de la crĂ©ation de l’UDF. En d’autres termes, la crĂ©ation de l’UDF se fait sans tenir compte de la validitĂ© du code. Si le code n’est pas valide, Snowflake renvoie des erreurs lorsque l’UDF est appelĂ©e au moment de la requĂȘte.

Python¶

  • Dans la clause HANDLER, le nom de la fonction du gestionnaire est sensible Ă  la casse.

  • Dans la clause IMPORTS :

    • Les noms de fichiers sont sensibles Ă  la casse.

    • Le(s) nom(s) de zone de prĂ©paration sont insensibles Ă  la casse.

  • Vous pouvez utiliser la clause PACKAGES pour spĂ©cifier les noms et les numĂ©ros de version du paquet pour les dĂ©pendances, comme celles de Snowpark. Pour les autres dĂ©pendances, spĂ©cifiez les fichiers de dĂ©pendance avec la clause IMPORTS.

  • Snowflake valide ceci :

    • La fonction ou la classe spĂ©cifiĂ©e dans le HANDLER de l’instruction CREATE FUNCTION existe.

    • Les types d’entrĂ©e et de sortie spĂ©cifiĂ©s dans la dĂ©claration de l’UDF sont compatibles avec les types d’entrĂ©e et de sortie du gestionnaire.

Scala¶

  • Dans la clause HANDLER, le nom de la mĂ©thode est sensible Ă  la casse.

  • Dans les clauses IMPORTS et TARGET_PATH :

    • Les noms de paquet, de classe et de fichier sont sensibles Ă  la casse.

    • Le(s) nom(s) de zone de prĂ©paration sont insensibles Ă  la casse.

  • Vous pouvez utiliser la clause PACKAGES pour spĂ©cifier les noms et les numĂ©ros de version du paquet pour les dĂ©pendances Snowflake dĂ©finies par le systĂšme, comme celles de Snowpark. Pour les autres dĂ©pendances, spĂ©cifiez les fichiers JAR de dĂ©pendance avec la clause IMPORTS.

  • Snowflake valide ceci :

    • Le fichier JAR spĂ©cifiĂ© dans le HANDLER de l’instruction CREATE FUNCTION existe et contient la classe et la mĂ©thode spĂ©cifiĂ©es.

    • Les types d’entrĂ©e et de sortie spĂ©cifiĂ©s dans la dĂ©claration de l’UDF sont compatibles avec les types d’entrĂ©e et de sortie de la mĂ©thode Scala.

    La validation peut se faire au moment de la crĂ©ation ou de l’exĂ©cution, selon que vous ĂȘtes connectĂ© ou non Ă  un entrepĂŽt Snowflake actif.

    • Au moment de la crĂ©ation — Si vous ĂȘtes connectĂ© Ă  un entrepĂŽt Snowflake actif au moment de l’exĂ©cution de l’instruction CREATE FUNCTION, l’UDF est validĂ©e au moment de la crĂ©ation.

    • Au moment de l’exĂ©cution — Si vous n’ĂȘtes pas connectĂ© Ă  un entrepĂŽt Snowflake actif, l’UDF est créée, mais n’est pas validĂ©e immĂ©diatement, et Snowflake renvoie le message suivant :

      Function <nom> created successfully, but could not be validated since there is no active warehouse.

SQL¶

  • Actuellement, la clause NOT NULL n’est pas appliquĂ©e pour des UDFs SQL.

Créer une UDF avec SQL¶

Vous pouvez créer une UDF avec SQL en suivant les étapes suivantes.

Utilisation de l'instruction CREATE FUNCTION pour associer la méthode du gestionnaire au nom de l'UDF

Vous créez une UDF en suivant les étapes suivantes :

  1. Écrivez le code du gestionnaire qui s’exĂ©cute lorsque l” UDF est appelĂ©e.

    Vous pouvez utiliser l’un des langages du gestionnaire pris en charge. Pour plus d’informations, voir Langages et outils pris en charge.

  2. Choisissez si vous allez garder le code du gestionnaire en ligne avec l’instruction CREATE FUNCTION SQL ou si vous allez y faire rĂ©fĂ©rence dans une zone de prĂ©paration.

    Chacun a ses avantages. Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de prĂ©paration.

  3. Exécutez une instruction CREATE FUNCTION dans SQL, en spécifiant les propriétés de la fonction.

    Le code de l’exemple suivant crĂ©e une UDF appelĂ©e function_name avec un gestionnaire en ligne HandlerClass.handlerMethod.

    create function function_name(x integer, y integer)
      returns integer
      language java
      handler='HandlerClass.handlerMethod'
      target_path='@~/HandlerCode.jar'
      as
      $$
          class HandlerClass {
              public static int handlerMethod(int x, int y) {
                return x + y;
              }
          }
      $$;
    
    Copy

    Les paragraphes suivants dĂ©crivent certaines des propriĂ©tĂ©s requises ou gĂ©nĂ©ralement utilisĂ©es lors de la crĂ©ation d’une fonction.

    • Nom de la fonction.

      Le nom de l’UDF ne doit pas nĂ©cessairement correspondre au nom de la mĂ©thode du gestionnaire. L’instruction CREATE FUNCTION associe le nom de l’UDF au gestionnaire.

      Pour plus d’informations sur les contraintes et les conventions relatives aux noms, voir Nommage et surcharge de procĂ©dures et d’UDFs.

    • Les arguments de la fonction, le cas Ă©chĂ©ant.

      Voir Définition des arguments pour UDFs et les procédures stockées.

    • Type de retour avec la clause RETURNS.

      Pour une valeur de retour scalaire, la clause RETURNS spécifiera un seul type de retour ; pour une valeur de retour tabulaire, RETURNS spécifiera le mot clé TABLE précisant le type de colonne dans la valeur de retour tabulaire.

      Pour plus d’informations sur la façon dont Snowflake fait correspondre les types de donnĂ©es SQL aux types de donnĂ©es des gestionnaires, voir Nommage et surcharge de procĂ©dures et d’UDFs.

    • Nom du gestionnaire avec la clause HANDLER.

      Si nĂ©cessaire, il s’agit du nom de la classe ou de la mĂ©thode contenant le code qui s’exĂ©cute lorsque l’UDF est appelĂ©e. Vous devez spĂ©cifier un nom de gestionnaire uniquement pour les gestionnaires Ă©crits en Java et en Python. Pour les gestionnaires JavaScript et SQL, tout le code spĂ©cifiĂ© en ligne sera exĂ©cutĂ© comme le gestionnaire.

      Le tableau suivant décrit la forme de la valeur de la clause HANDLER en fonction du langage et du type de fonction du gestionnaire.

      Langage du gestionnaire

      UDF

      UDTF

      Java

      Nom de la classe et de la méthode.

      Par exemple : MyClass.myMethod

      Nom de la classe seulement. Le nom de la mĂ©thode du gestionnaire est prĂ©dĂ©terminĂ© par l’interface requise.

      JavaScript

      Aucun.

      Aucun.

      Python

      Nom de la classe et de la méthode si une classe est utilisée ; sinon, nom de la fonction.

      Par exemple : module.my_function ou my_function

      Nom de la classe seulement. Le nom de la mĂ©thode du gestionnaire est prĂ©dĂ©terminĂ© par l’interface requise.

      SQL

      Aucun.

      Aucun.

    • DĂ©pendances requises par le gestionnaire, le cas Ă©chĂ©ant, en utilisant les clauses IMPORTS ou PACKAGES.

      Pour plus d’informations sur la mise Ă  disposition des dĂ©pendances pour votre gestionnaire, voir Mettre les dĂ©pendances Ă  la disposition de votre code.

    • ExĂ©cution du langage du gestionnaire avec la clause RUNTIME_VERSION.

      Lorsque le langage du gestionnaire est Java ou Python, utilisez la clause RUNTIME_VERSION pour spĂ©cifier la version d’exĂ©cution prise en charge Ă  utiliser. En omettant la clause, Snowflake utilisera la valeur par dĂ©faut, qui peut changer Ă  l’avenir.