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Ă©er une fonction dĂ©finie par l’utilisateur.

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 SĂ©lection 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 Accorder des privilĂšges pour les fonctions dĂ©finies par l’utilisateur.