Création d’un gestionnaire d’UDF Java

Cette rubrique décrit comment écrire le gestionnaire Java pour une fonction définie par l’utilisateur (UDF). Lorsque vous écrivez une UDF Java, vous écrivez du code Java pour que Snowflake l’exécute comme une logique UDF. Ce code Java est le gestionnaire de l’UDF.

Vous déployez l’UDF avec le CREATE FUNCTION, en donnant un nom à l’UDF et en spécifiant la méthode Java comme gestionnaire à utiliser lors de l’appel de l’UDF. Pour plus d’informations sur la création d’une UDF avec SQL, voir Création d’une UDF.

Pour plus d’exemples de code, voir Exemples de gestionnaires d’UDF Java.

Dans ce chapitre :

Écriture du gestionnaire de l’UDF en Java

Utilisez les exigences et les lignes directrices suivantes lors de l’écriture de votre gestionnaire d’UDF Java.

  • Définissez la classe comme publique.

  • Dans la classe, déclarez au moins une méthode publique à utiliser comme gestionnaire d’UDF.

    Pour une UDF en ligne, déclarez une seule méthode de gestionnaire. Si, au contraire, vous avez l’intention d’empaqueter la classe dans un JAR en tant que gestionnaire en zone de préparation, vous pouvez déclarer plusieurs méthodes de gestionnaire, puis spécifier chacune d’elles en tant que gestionnaire avec la clause HANDLER d’une instruction CREATE FUNCTION.

    Pour en savoir plus sur la différence entre un gestionnaire en ligne et un gestionnaire mis en zone de préparation, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.

    Vous pouvez déclarer d’autres méthodes, si nécessaire, qui seront appelées par la méthode de gestionnaire.

    Utilisez les exigences et les lignes directrices suivantes pour chaque méthode de gestionnaire :

    • Déclarez la méthode de gestionnaire comme publique, soit statique, soit non statique.

      Si la méthode n’est pas statique, votre classe doit également déclarer un constructeur à zéro argument ou pas de constructeur du tout.

      Snowflake ne transmet aucun argument au constructeur lorsqu’il instancie la classe. Si le constructeur génère une erreur, celle-ci est signalée comme une erreur de l’utilisateur, avec le message d’exception.

    • Spécifiez un type de retour approprié.

      Le type de retour doit être l’un des types de données spécifiés dans la colonne Java Data Type de la table SQL-Java Type Mappings. Le type de retour doit être compatible avec le type de données SQL spécifié dans la clause RETURNS de l’instruction CREATE FUNCTION.

    • Assurez-vous que chaque argument de méthode de gestionnaire (le cas échéant) est un type de données spécifié dans la colonne Java Data Type de la table SQL-Java Type Mappings.

      Lorsque vous choisissez les types de données des variables Java, tenez compte des valeurs maximales et minimales possibles des données qui pourraient être envoyées de (et retournées à) Snowflake.

    • Si vous surchargez une méthode dans une classe Java donnée, gardez à l’esprit que Snowflake utilise uniquement le nombre d’arguments de la méthode, et non leurs types, pour différencier les méthodes de gestionnaire au sein d’une classe. La résolution basée sur les types de données n’est pas pratique, car certains types de données SQL peuvent être mappés à plus d’un type de données Java et donc potentiellement à plusieurs signatures de méthode de gestionnaire.

      Par exemple, si deux méthodes Java d’une classe ont le même nom, le même nombre d’arguments et des types de données différents, l’appel d’une UDF qui utilise l’une de ces méthodes comme gestionnaire génère une erreur similaire à la suivante :

      Cannot determine which implementation of handler "handler name" to invoke since there are multiple
      definitions with <number of args> arguments in function <user defined function name> with
      handler <class name>.<handler name>
      

      Si un entrepôt est disponible, l’erreur est détectée au moment où l’UDF est créée. Sinon, l’erreur se produit lors de l’appel de l’UDF.

    • Respectez les contraintes imposées par Snowflake pour les UDFs Java dans chaque méthode du gestionnaire et dans les méthodes qu’il appelle. Pour en savoir plus sur ces contraintes, voir Concevoir des gestionnaires qui respectent les contraintes imposées par Snowflake.

Ajouter des dépendances au Classpath

Lorsque le code de votre gestionnaire nécessite des classes empaquetées dans des fichiers JAR externes, vous pouvez ajouter ces dépendances au classpath géré par Snowflake disponible pour votre gestionnaire. Ce qui suit décrit comment ajouter des fichiers JAR au classpath visible par un gestionnaire d’UDF Java. Pour plus d’informations, voir Mettre les dépendances à la disposition de votre code.

Organiser vos fichiers

Si vous prévoyez de compiler vous-même le code Java pour créer le fichier JAR, vous pouvez organiser les fichiers comme indiqué ci-dessous. Cet exemple suppose que vous prévoyez d’utiliser le mécanisme de paquetage de Java.

  • developmentDirectory

    • packageDirectory

      • class_file1.java

      • class_file2.java

    • classDirectory

      • class_file1.class

      • class_file2.class

    • manifest_file.manifest (facultatif)

    • jar_file.jar

    • put_command.sql

developmentDirectory

Ce répertoire contient les fichiers spécifiques au projet nécessaires à la création de votre UDF Java.

packageDirectory

Ce répertoire contient les fichiers .java à compiler et à inclure dans le paquet.

class_file#.java

Ces fichiers contiennent le code source Java de l’UDF.

class_file#.class

Il s’agit du ou des fichiers .class créés en compilant des fichiers .java.

manifest_file.manifest

Le fichier manifeste facultatif utilisé lors de la combinaison des fichiers .class (et éventuellement des fichiers JAR de dépendance) dans le fichier JAR.

jar_file.jar

Le fichier JAR qui contient le code de l’UDF.

put_command.sql

Ce fichier contient la commande SQL PUT permettant de copier le fichier JAR vers une zone de préparation Snowflake.

Compilation du code Java et création du fichier JAR

Pour créer un fichier JAR qui contient le code Java compilé :

  • Utilisez javac pour compiler votre fichier .java en un fichier .class.

    Si vous utilisez un compilateur plus récent que la version 11.x, vous pouvez utiliser l’option « –release » pour spécifier que la version cible est la version 11.

  • Placez votre fichier .class dans un fichier JAR. Vous pouvez regrouper plusieurs fichiers de classe (et d’autres fichiers JAR) dans votre fichier JAR.

    Par exemple :

    jar cf ./my_udf.jar MyClass.class
    
    Copy

    Un fichier manifeste est obligatoire si votre classe de gestionnaire fait partie d’un paquet, et facultatif dans le cas contraire. L’exemple suivant utilise un fichier manifeste :

    jar cmf my_udf.manifest ./my_udf.jar example/MyClass.class
    
    Copy

    Pour construire le fichier jar avec toutes les dépendances incluses, vous pouvez utiliser la commande mvn package de Maven avec le maven-assembly-plugin. Pour plus d’informations sur le plugin maven-assembly, voir la page sur l’utilisation de Maven.

    Snowflake fournit automatiquement les bibliothèques Java standards (par exemple, java.util). Si votre code fait appel à ces bibliothèques, vous n’avez pas besoin de les inclure dans votre fichier JAR.

    Les méthodes que vous appelez dans les bibliothèques doivent respecter les mêmes contraintes imposées par Snowflake que votre méthode Java. Pour en savoir plus sur ces contraintes, voir Concevoir des gestionnaires qui respectent les contraintes imposées par Snowflake.

Copie du fichier JAR dans votre zone de préparation

Pour que Snowflake puisse lire le fichier JAR contenant votre méthode de gestionnaire, vous devez copier le fichier JAR dans l’un des types de zone de préparation suivants :

  • Une zone de préparation interne utilisateur ou nommée.

    Snowflake ne prend actuellement pas en charge l’utilisation d’une zone de préparation de table pour stocker un fichier JAR avec des gestionnaires UDF. Pour en savoir plus sur les zones de préparation internes, voir Choix d’une zone de préparation interne pour les fichiers locaux.

  • Zone de préparation externe.

La zone de préparation hébergeant le fichier JAR doit être lisible par le propriétaire de l’UDF.

Typiquement, vous chargez le fichier JAR vers une zone de préparation interne nommée en utilisant la commande PUT. Notez que vous ne pouvez pas exécuter la commande PUT par la GUI de Snowflake ; vous pouvez utiliser SnowSQL pour exécuter PUT. Voir la section Exemples de gestionnaires d’UDF Java pour un exemple de commande PUT pour copier un fichier .jar dans une zone de préparation.

Pour plus d’informations sur la création de zones de préparation, voir CREATE STAGE.

Mises en garde et meilleures pratiques

Si vous supprimez ou renommez le fichier JAR, vous ne pouvez plus appeler l’UDF.

Si vous devez mettre à jour votre fichier JAR, alors :

  • Mettez-le à jour tant qu’aucun appel vers l’UDF ne peut être fait.

  • Si l’ancien fichier .jar se trouve toujours dans la zone de préparation, la commande PUT doit inclure la clause OVERWRITE=TRUE.

Note

Un utilisateur effectuant une action liée à des UDFs doit avoir un rôle auquel ont été attribuées les autorisations requises pour cette action. Pour plus d’informations, voir Granting Privileges for User-Defined Functions.