CrĂ©ation dâUDFs Python¶
Cette rubrique montre comment crĂ©er et installer une UDF Python (fonction dĂ©finie par lâutilisateur).
Dans ce chapitre :
Ăcrire le code Python¶
Ăcriture le module et la fonction Python¶
Ăcrivez un module qui suit les spĂ©cifications ci-dessous :
Définissez le module. Un module est un fichier contenant des définitions et des instructions Python.
DĂ©finissez une fonction Ă lâintĂ©rieur du module.
Si la mĂ©thode accepte des arguments, chaque argument doit ĂȘtre lâun des types de donnĂ©es spĂ©cifiĂ©s dans la colonne
Python Data Type
de la table SQL-Python Type Mappings.Les arguments de fonction sont liĂ©s par leur position, et non par leur nom. Le premier argument transmis Ă lâUDF est le premier argument reçu par la mĂ©thode Python.
SpĂ©cifiez une valeur de retour appropriĂ©e. Comme une UDF Python doit ĂȘtre une fonction scalaire, elle doit renvoyer une valeur Ă chaque fois quâelle est appelĂ©e. Le type de la valeur de retour doit ĂȘtre lâun des types de donnĂ©es spĂ©cifiĂ©s dans la colonne
Python Data Type
de la table SQL-Python Type Mappings. Le type de la valeur de retour doit ĂȘtre compatible avec le type de donnĂ©es SQL spĂ©cifiĂ© dans la clauseRETURNS
de lâinstruction CREATE FUNCTION.Votre module peut contenir plus dâune fonction. La fonction qui est appelĂ©e par Snowflake peut appeler dâautres fonctions dans le mĂȘme module ou dans dâautres modules.
Votre fonction (et toute fonction appelée par votre fonction) doit respecter les contraintes Snowflake imposées pour les UDFs Python.
Note
Les UDFs Python vectorisĂ©es vous permettent de dĂ©finir des fonctions Python qui reçoivent des lots de lignes dâentrĂ©e sous forme de DataFrames Pandas et renvoient des lots de rĂ©sultats sous forme de tableaux ou de sĂ©ries Pandas. Pour plus dâinformations, voir UDFs Python vectorisĂ©es.
Création de la fonction dans Snowflake¶
Vous devez exécuter une instruction CREATE FUNCTION pour spécifier :
Nom Ă utiliser pour lâUDF.
Le nom de la fonction Python Ă appeler lorsque lâUDF Python est appelĂ©e.
Le nom de lâUDF ne doit pas nĂ©cessairement correspondre au nom de la fonction du gestionnaire Ă©crit en Python. La clause HANDLER dans lâinstruction CREATE FUNCTION associe le nom de lâUDF Ă la fonction Python.
Pour choisir un nom pour lâUDF, reportez-vous Ă Nommage et surcharge de procĂ©dures et dâUDFs :
Dans le corps de lâinstruction CREATE FUNCTION, les arguments de la fonction sont liĂ©s Ă la position, pas au nom. Le premier argument dĂ©clarĂ© dans lâinstruction CREATE FUNCTION est le premier argument transmis Ă la fonction Python.
Pour plus dâinformations sur les types de donnĂ©es des arguments, voir Mappages des types de donnĂ©es SQL-Python.
Définissez runtime_version
sur la version de lâenvironnement dâexĂ©cution Python requise par votre code. Les versions de Python prises en charge sont les suivantes :
3,9
3,10
3,11
3,12
Les UDFs avec du code en ligne vs. les UDFs avec du code tĂ©lĂ©chargĂ© Ă partir dâune zone de prĂ©paration¶
Le code dâune UDF Python peut ĂȘtre spĂ©cifiĂ© de lâune des maniĂšres suivantes :
TĂ©lĂ©chargĂ© Ă partir dâune zone de prĂ©paration : lâinstruction CREATE FUNCTION spĂ©cifie lâemplacement dâun code source Python existant dans une zone de prĂ©paration.
En ligne : lâinstruction CREATE FUNCTION spĂ©cifie le code source Python.
CrĂ©ation dâune UDF Python en ligne¶
Pour une UDF en ligne, vous fournissez le code source Python dans le cadre de lâinstruction CREATE FUNCTION.
Par exemple, lâinstruction suivante crĂ©e une UDF Python en ligne qui ajoute +1 Ă un nombre entier donnĂ© :
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
$$;
Le code source Python est spécifié dans la clause AS
. Le code source peut ĂȘtre dĂ©limitĂ© soit de guillemets simples, soit dâune paire de signes de dollar ($$
). Lâutilisation du double signe dollar est gĂ©nĂ©ralement plus facile si le code source contient des guillemets simples intĂ©grĂ©s.
Appelez lâUDF :
SELECT addone(10);
Voici la sortie :
+------------+
| ADDONE(10) |
|------------|
| 11 |
+------------+
Le code source Python peut contenir plus dâun module, et plus dâune fonction dans un module, donc la clause HANDLER
spécifie le module et la fonction à appeler.
Une UDF Python en ligne peut appeler du code dans les modules qui sont inclus dans la clause IMPORTS
.
Pour plus de dĂ©tails sur la syntaxe de lâinstruction CREATE FUNCTION, voir CREATE FUNCTION.
Pour plus dâexemples, voir Exemples dâUDF Python en ligne.
CrĂ©ation dâune UDF Python avec du code tĂ©lĂ©chargĂ© Ă partir dâune zone de prĂ©paration¶
Les instructions suivantes crĂ©ent une simple UDF Python en utilisant du code tĂ©lĂ©chargĂ© Ă partir dâune zone de prĂ©paration. La zone de prĂ©paration hĂ©bergeant le fichier doit ĂȘtre lisible par le propriĂ©taire de lâUDF. En outre, les fichiers ZIP doivent ĂȘtre autonomes et ne pas dĂ©pendre de scripts dâinstallation supplĂ©mentaires pour ĂȘtre exĂ©cutĂ©s.
Créez un fichier Python nommé sleepy.py
qui contient votre code source :
def snore(n): # return a series of n snores
result = []
for a in range(n):
result.append("Zzz")
return result
Lancez SnowSQL (CLI client) et utilisez la commande PUT pour copier le fichier du systÚme de fichiers local vers une zone de préparation utilisateur par défaut, nommée @~
. (La commande PUT
ne peut pas ĂȘtre exĂ©cutĂ©e par la GUI Snowflake.)
put
file:///Users/Me/sleepy.py
@~/
auto_compress = false
overwrite = true
;
Si vous supprimez ou renommez le fichier, vous ne pouvez plus appeler lâUDF. Si vous devez mettre Ă jour votre fichier, faites-le pendant quâaucun appel Ă lâUDF ne soit possible. Si lâancien fichier .jar se trouve toujours dans la zone de prĂ©paration, la commande PUT
doit inclure la clause OVERWRITE=TRUE
.
CrĂ©ez lâUDF. Le gestionnaire spĂ©cifie le module et la fonction.
CREATE OR REPLACE FUNCTION dream(i INT)
RETURNS VARIANT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
HANDLER = 'sleepy.snore'
IMPORTS = ('@~/sleepy.py')
Appelez lâUDF :
SELECT dream(3);
+----------+
| DREAM(3) |
|----------|
| [ |
| "Zzz", |
| "Zzz", |
| "Zzz" |
| ] |
+----------+
SpĂ©cification de fichiers dâimportation multiples¶
Voici un exemple de la façon de spĂ©cifier plusieurs fichiers dâimportation.
CREATE OR REPLACE FUNCTION multiple_import_files(s STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
IMPORTS = ('@python_udf_dep/bar/python_imports_a.zip', '@python_udf_dep/foo/python_imports_b.zip')
HANDLER = 'compute'
AS $$
def compute(s):
return s
$$;
Note
Les noms des fichiers dâimportation spĂ©cifiĂ©s doivent ĂȘtre diffĂ©rents. Par exemple, ceci ne fonctionnera pas : imports=('@python_udf_dep/bar/python_imports.zip', '@python_udf_dep/foo/python_imports.zip')
.
Accorder des privilÚges sur la fonction¶
Pour quâun rĂŽle autre que le propriĂ©taire de la fonction puisse appeler la fonction, le propriĂ©taire doit accorder les privilĂšges appropriĂ©s au rĂŽle.
Les instructions GRANT pour une UDF Python sont essentiellement identiques aux instructions GRANT pour dâautres UDFs, comme les UDFs JavaScript.
Par exemple :
GRANT USAGE ON FUNCTION my_python_udf(number, number) TO my_role;