Charger et utiliser des fonctions personnalisées dans les salles blanches de données de collaboration¶
Introduction¶
Tout collaborateur peut charger des UDFs et des UDTFs Python personnalisées vers une collaboration. Les modèles de la collaboration peuvent exécuter ces fonctions pour effectuer des actions de données complexes. L’utilisation courante inclut le machine learning ou la manipulation de données personnalisée dans une requête. Votre code chargé peut importer et utiliser des paquets à partir d’un bundle de packages Python approuvés et des paquets Snowpark API.
Note
Python est le seul langage de codage pris en charge pour les UDFs personnalisées.
Les sections suivantes vous montrent comment charger et utiliser une fonction personnalisée.
Définir et utiliser des bundles de codes personnalisés¶
Voici comment charger et utiliser une fonction personnalisée :
Le demandeur de code :
Crée et enregistre le code en appelant REGISTER_CODE_SPEC.
Le code peut être en ligne dans la spécification, ou lié à une zone de préparation.
Crée un modèle qui fait référence à la spécification du bundle de code par son ID dans le tableau
code_specsdu modèle. Ajoutez ce champ en tant que pair des champs du modèle et de paramètres, comme indiqué dans cet exemple :Enregistre le modèle, puis lie le modèle à la collaboration.
Note
Snowflake analyse le code importé pour détecter les problèmes de sécurité. Si un problème de sécurité est détecté, le code, ainsi que le modèle le contenant, ne seront pas ajoutés à la collaboration.
L’exécuteur d’analyses :
Exécute le modèle de la manière standard en appelant
RUN.
Important
Snowflake effectue des contrôles de sécurité sur tous les bundles chargés avant de les déployer dans une salle blanche. Si un contrôle de sécurité échoue, le modèle et son code regroupé ne seront pas déployés et disponibles pour l’utilisation.
Pour confirmer qu’un modèle avec un bundle de code est déployé et prêt à l’emploi, procédez comme suit :
Recherchez le nom de l’application de salles blanches dans laquelle vous essayez de déployer le bundle de code :
Vérifiez la valeur
upgrade_statedans la réponse DESCRIBE APPLICATION. Lorsque l’état de mise à niveau est COMPLETE, les contrôles de sécurité ont réussi et le nouveau modèle et le nouveau bundle sont disponibles pour l’utilisation. Transmettez le nom de l’application renvoyé par la commande à l’étape précédente en utilisant SQL comme dans l’exemple suivant : code SQL :
Créer et enregistrer la spécification du bundle de code¶
La première étape du chargement d’un code personnalisé consiste à créer et à enregistrer la spécification du bundle de code.
Les fonctions personnalisées sont définies dans une spécification de bundle de code YAML. Chaque bundle de code expose une ou plusieurs fonctions qui peuvent être appelées par un modèle. La spécification du bundle de code peut soit inclure le code dans la spécification en ligne, soit renvoyer vers un code qui réside sur une zone de préparation Snowflake.
Un collaborateur enregistre une spécification en appelant``REGISTRY.REGISTER_CODE_SPEC``, qui renvoie l’ID du bundle. Tout collaborateur, quel que soit son rôle, peut enregistrer et lier un bundle de code.
Une fois que le bundle de code est lié à la collaboration, ce bundle de code est visible par toute personne de la collaboration qui peut accéder à un modèle qui lie le bundle de code. Appelez VIEW_CODE_SPECS pour répertorier les bundles de code accessibles dans une collaboration.
Toute personne pouvant voir un bundle de code dans une collaboration peut le voir et l’utiliser dans ses propres modèles au sein de cette collaboration. Tout code en ligne peut être vu par n’importe quel membre de la collaboration, mais le code d’artefact en zone de préparation ne peut pas être vu par les collaborateurs.
La spécification du bundle de code suivant qui expose une seule UDF Python appelée normalize_value, qui appelle la fonction normalize définie dans cette spécification :
Créer et enregistrer le modèle appelant¶
Une fois la spécification de code enregistrée, le collaborateur enregistre un modèle qui utilise ce bundle de code. Pour utiliser un bundle de code, ajoutez l’ID de la spécification du bundle dans le champ code_specs du modèle.
Un modèle appelle une fonction personnalisée à l’aide de la syntaxe cleanroom.spec_name$function_name. Notez les marques littérales de portée de nom . et $.
Note
Utilisez le nom de la spécification, et non l’ID de la spécification, pour référencer une fonction dans votre modèle.
Dans l’exemple suivant, un modèle utilise la fonction normalize_value du bundle de code custom_udf :
Ajouter un modèle à une collaboration¶
Ajoutez le modèle qui appelle votre fonction à la collaboration de manière standard. Pour plus d’informations, voir Modèles.
Snowflake valide et charge vers la collaboration lorsque le modèle appelant est ajouté à une collaboration. Snowflake analyse le code importé pour détecter les problèmes de sécurité avant d’installer le code.
L’exemple suivant montre une requête pour ajouter un modèle à une collaboration existante :
Soumettre une nouvelle version de votre bundle de code¶
Chaque spécification de code enregistrée doit posséder un nom et une version uniques dans tous les registres de votre compte. Un modèle charge un nom et une version spécifiques d’une spécification de code. Si vous souhaitez créer ou consommer une nouvelle version de votre code, vous devez soumettre une nouvelle version du modèle qui fait référence à la nouvelle version du code dans le champ code_specs. Vous n’avez pas besoin de modifier le corps du modèle. Par exemple :
Étape 1 : consommez la version 1 du bundle de code :
Étape 2 : mettez à jour et enregistrez la nouvelle version de votre bundle de code, puis mettez à jour votre modèle pour utiliser la nouvelle version :
Notez que les noms de fonctions n’incluent pas la version, de sorte que vous n’avez pas besoin de modifier le code d’appel dans le corps du modèle lorsque vous chargez une nouvelle version d’une fonction.
Spécification du bundle de code¶
Cette spécification définit un bundle d’une ou plusieurs fonctions ou procédures de code qui peuvent être appelées par un modèle.
Une spécification de bundle de code comporte un maximum de 5 fonctions plus procédures.
Les identificateurs de la spécification du bundle de code présentent les exigences générales suivantes :
Noms : Doivent être des identificateurs Snowflake valides qui commencent par une lettre et ne contiennent que des caractères alphanumériques et des traits de soulignement.
Identificateurs avec guillemets : Les identificateurs entre guillemets doubles sont pris en charge pour les noms contenant des caractères spéciaux.
Sensibilité à la casse : Les identificateurs sans guillemets sont insensibles à la casse ; les identificateurs entre guillemets préservent la casse.
api_versionVersion de l’API de collaboration utilisée. Doit être
2.0.0.spec_typeIdentificateur du type de spécification. Doit être
code_spec.name: identifierUn nom unique pour cette spécification de bundle de code dans ce registre. Doit être un identificateur Snowflake valide avec un maximum de 75 caractères. Il est utilisé comme segment de nom de famille lors de l’appel de la fonction dans un modèle :
cleanroom.code_spec_name$function_nameversion: version_idIdentificateur de version personnalisée. Doit être alphanumérique avec des traits de soulignement, 20 caractères au maximum.
description: description_text(Facultatif)Une description de la spécification du bundle de code (1 000 caractères maximum).
artifacts(Facultatif)Une liste des fichiers ou des paquets en zone de préparation qui peuvent être importés par vos fonctions ou procédures, et :ref:` éventuellement exposés via des fonctions de gestionnaire <label-dcr_collab_code_bundles_staged_artifacts>`. Maximum de 5 par spécification.
alias: identifierUn alias pour référencer cet artefact dans les importations. Lorsque vous faites référence à cet alias dans cette spécification, utilisez le nom d’alias brut plutôt que
cleanroom.spec_name$alias; autrement dit, utilisez le nom de la fonction vide pour référencer une autre fonction dans cette spécification.stage_path: stage_pathChemin complet de la zone de préparation vers le fichier d’artefact ; par exemple,
@DB.SCHEMA.STAGE/path/file.whl.
La zone de préparation doit être interne. Les zones de préparation externes ne sont pas prises en charge.
La zone de préparation doit avoir DIRECTORY activé : La zone de préparation contenant les artefacts doit avoir
DIRECTORY = TRUEdéfini.Format du chemin de la zone de préparation : Doit suivre le format
@[DB.]SCHEMA.STAGE/path/to/file.ext.Pas de déplacement de chemin : Les chemins de zone de préparation ne peuvent pas contenir
..ou\.Cet artefact doit exister : Le fichier doit exister au niveau du chemin de la zone de préparation spécifié lors de l’enregistrement du bundle de code.
La zone de préparation doit avoir le chiffrement coté serveur SNOWFLAKE_SSE activé. Lors de la création ou de la modification de la zone de préparation, définissez
ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE').Si vous poussez, supprimez ou mettez à jour un fichier de code en zone de préparation, vous devez appeler
ALTER STAGE stage name REFRESHpour vous assurer que la collaboration dispose des informations les plus récentes sur la zone de préparation. Les mises à jour du code ne sont prises en charge qu’avant l’enregistrement de la spécification de code, car c’est à ce moment-là que la version est attribuée et que la somme de contrôle de hachage est calculée.
description: description_text(Facultatif)Une description de l’artefact (500 caractères maximum).
content_hash: sha256_hash(Facultatif)Hachage SHA-256 pour la vérification de l’intégrité (64 caractères hexadécimaux).
functions(Nécessaire si aucune procédure n’est définie)Une liste de définitions UDF ou UDTF.
name identifierLe nom de la fonction à exposer au modèle appelant. Doit être un identificateur Snowflake valide.
typeLe type de fonction. L’un des rôles suivants :
UDFouUDTF.languageLa langue de la fonction. Actuellement, seulement
PYTHONest pris en charge.runtime_version: python_version(Facultatif)Version de l’environnement d’exécution Python à utiliser. Versions prises en charge :
3.10à3.14.handler: handlerLe nom de la fonction de gestionnaire dans le code de la fonction à appeler lorsque
nameest appelé.arguments(Facultatif)Arguments de fonction sous forme de liste de paires nom-type. Les types doivent être des types SQL Snowflake valides.
returns: sql_typeLe type de retour. Pour les UDFs, utilisez un type SQL tel que
STRINGouFLOAT. Pour UDTFs, utilisezTABLE(column_definitions).packages(Facultatif)Une liste des paquets utilisés par ce code. Il peut s’agir de n’importe lesquels de ces paquets Anaconda Python ou de ces paquets API Snowpark. Par exemple :
snowflake-snowpark-python,numpy.imports(Facultatif)Une liste d’artefacts à importer. Il doit s’agir d’alias de la liste des artefacts de cette spécification.
code_body(Facultatif)Code Python en ligne. Mutuellement exclusifs avec les importations en zone de préparation. La taille maximale est de 12 MB.
description: description_text(Facultatif)Une description de la fonction (500 caractères maximum).
procedures(Nécessaire si aucune fonction n’est définie)Une liste de définitions de procédures stockées. Les champs sont similaires à
functions, sauf qu’il n’y a pas de champtype.
Référence API¶
Les procédures suivantes sont utilisées pour gérer les bundles de code personnalisés dans une collaboration :
REGISTER_CODE_SPEC¶
- Schéma:
REGISTRY
Enregistre un bundle de code. Cela stocke le code dans l’environnement des salles blanches dans la table REGISTRY.CODE_SPECS. Une fois qu’une spécification de code est enregistrée, elle peut être utilisée par un modèle.
Chaque spécification de code enregistrée doit avoir un nom et une version uniques dans tous les registres de votre compte.
Syntaxe¶
Arguments¶
registry_name(Facultatif)Nom d’un registre personnalisé dans lequel enregistrer cette spécification de code. Si non spécifié, enregistre le bundle de code dans le registre de compte par défaut.
code_specDéfinition de la spécification du bundle de code au format YAML, sous forme de chaîne.
Renvoie¶
L’ID de la spécification du bundle de code générée.
Exemples¶
Enregistrer un bundle de code dans le registre par défaut :
Enregistrer un bundle de code dans un registre personnalisé :
Exigences d’accès¶
Si vous n’utilisez pas le rôle SAMOOHA_APP_ROLE, vous devez utiliser un rôle qui s’est vu accorder l’un des privilèges suivants.
Pour enregistrer une spécification de code dans le registre par défaut :
GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REGISTER CODE SPEC', 'role name')
Pour enregistrer des éléments dans un registre personnalisé :
Vous disposez de privilèges de lecture et d’écriture sur tout registre personnalisé que vous avez créé vous-même.
Pour accéder à un registre personnalisé créé par un autre utilisateur, vous devez
GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('REGISTER', 'REGISTRY', 'MY_REGISTRY', 'role name').
VIEW_REGISTERED_CODE_SPECS¶
- Schéma:
REGISTRY
Répertorie toutes les spécifications de bundle de code enregistrées par ce rôle dans le registre de comptes local.
Syntaxe¶
Arguments¶
registry_name(Facultatif)Nom d’un registre personnalisé pour répertorier les spécifications de code. Si non spécifié, répertorie les spécifications de code du registre de comptes par défaut.
Renvoie¶
Une table qui répertorie les détails de tous les bundles de code que vous avez enregistrés dans ce compte. Le tableau comprend les colonnes suivantes :
CODE_SPEC_ID: ID de la spécification du bundle de code.NAME: Nom de la spécification du bundle de code.VERSION: Version de la spécification du bundle de code.CODE_SPEC: Spécification YAML complète de la spécification du bundle de code.
Exemple¶
Exigences d’accès¶
Si vous n’utilisez pas le rôle SAMOOHA_APP_ROLE, vous devez utiliser un rôle qui s’est vu accorder l’un des privilèges suivants.
Pour voir les éléments du registre par défaut :
GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('VIEW REGISTERED CODE SPECS', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REVIEW COLLABORATION', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('CREATE COLLABORATION', 'role name')
Pour afficher les éléments d’un registre spécifique :
Vous disposez de privilèges de lecture et d’écriture sur tout registre personnalisé que vous avez créé vous-même.
Pour accéder à un registre personnalisé créé par un autre utilisateur, vous devez
GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('READ', 'REGISTRY', 'MY_REGISTRY', 'role name').
VIEW_CODE_SPECS¶
- Schéma:
COLLABORATION
Renvoie toutes les spécifications de bundle de code qui sont référencées par n’importe quel modèle que vous avez créé ou que vous pouvez exécuter dans la collaboration spécifiée.
Syntaxe¶
Arguments¶
collaboration_nameID de la collaboration.
Renvoie¶
Une table qui répertorie les bundles de code disponibles dans la collaboration spécifiée. Le tableau comprend les colonnes suivantes :
CODE_SPEC_ID: ID de cette spécification de bundle de code.CODE_SPEC: Spécification YAML complète de la spécification du bundle de code.SHARED_BY: Alias du collaborateur qui a partagé la spécification du bundle de code.
Exemple¶
Exigences d’accès¶
Si vous n’utilisez pas le rôle SAMOOHA_APP_ROLE, vous devez utiliser un rôle qui s’est vu accorder l’un des privilèges suivants :
GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('VIEW CODE SPECS', 'COLLABORATION', 'collaboration name', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REVIEW COLLABORATION', 'role name')GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('CREATE COLLABORATION', 'role name')
Exemples de spécifications¶
UDF en ligne avec corps de code¶
Une UDF simple avec du code Python en ligne :
UDTF (Fonction de table définie par l’utilisateur)¶
Cet exemple de YAML définit une UDTF qui renvoie plusieurs lignes :
Artefact en zone de préparation avec paquet de roue¶
Assurez-vous de consulter les exigences de la documentation stage_path pour la liaison vers un code en zone de préparation dans votre spécification de code.
Cet exemple de YAML utilise un paquet de roue Python en zone de préparation :
Procédure stockée¶
Cet exemple de YAML définit une procédure stockée pour le traitement des données :
Plusieurs fichiers Python comme artefacts en zone de préparation¶
Assurez-vous de consulter les exigences de la documentation stage_path pour la liaison vers un code en zone de préparation dans votre spécification de code.
Cet exemple de YAML utilise plusieurs fichiers sources Python en zone de préparation :
Dépannage des bundles de code¶
- Erreur:
CodeSpecAlreadyExistsException- Cause:
Spécification de bundle de code avec le même nom et la même version déjà enregistrée.
- Solution:
Utilisez une autre version ou mettez à jour la version existante.
- Erreur:
SpecValidationError- Cause:
YAML n’est pas conforme au schéma.
- Solution:
Vérifiez les champs obligatoires et le format.
- Erreur:
CodeSpecStageNotAccessibleError- Cause:
La zone de préparation référencée dans l’artefact n’est pas accessible.
- Solution:
Accordez l’accès à la zone de préparation ou vérifiez que la zone de préparation existe.
- Erreur:
CodeSpecArtifactNotFoundAtStageError- Cause:
Fichier introuvable dans le chemin de zone de préparation spécifié.
- Solution:
Chargez le fichier dans la zone de préparation avant de l’enregistrer.
- Erreur:
StageDirectoryNotEnabledError- Cause:
La zone de préparation n’a pas DIRECTORY activé.
- Solution:
Activez le répertoire sur la zone de préparation :
ALTER STAGE ... SET DIRECTORY = (ENABLE = TRUE)
- Erreur:
CodeSpecNotFoundForOwnerException- Cause:
Le modèle fait référence à une spécification de bundle de code non enregistrée.
- Solution:
Enregistrez la spécification du bundle de code avant d’enregistrer le modèle.