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
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
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 clauseOVERWRITE=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.