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 :

  1. 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.

  2. Crée un modèle qui fait référence à la spécification du bundle de code par son ID dans le tableau code_specs du modèle. Ajoutez ce champ en tant que pair des champs du modèle et de paramètres, comme indiqué dans cet exemple :

     parameters:
       - name: <parameter_name>
         description: <parameter_description>
         required: <true_or_false>
         default: <default_value>
         type: <data_type>
    
     code_specs:             # Optional: List of code bundles used by this template
     - <code_spec_id>        # One or more code spec IDs.
    
     template: |
       <template_content>
    
  3. 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 :

  1. Recherchez le nom de l’application de salles blanches dans laquelle vous essayez de déployer le bundle de code :

    SHOW APPLICATIONS LIKE 'SFDCR_<collaboration name>';
    
  2. Vérifiez la valeur upgrade_state dans 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 :

    DESCRIBE APPLICATION <application name>
    

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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value):
            return value / 100.0
  $$
);

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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v1
  type: sql_analysis
  code_specs:
    - custom_udf_v1  -- Imports the code bundle.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- Calls the UDF.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.ADD_TEMPLATE_REQUEST(
  'my_collaboration',
  'normalization_template_v1',
  ['consumer']
);

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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v1
  type: sql_analysis
  code_specs:
    - custom_udf_v1  -- Bundle ID includes the version number.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- Calls the UDF.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

É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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_TEMPLATE(
  $$
  api_version: 2.0.0
  spec_type: template
  name: normalization_template
  version: v2        -- Update the template version.
  type: sql_analysis
  code_specs:
    - custom_udf_v2  -- Use the new code bundle.
  template: |
    SELECT cleanroom.custom_udf$normalize_value(metric, 0, 100)  -- No change needed here.
      AS normalized
        FROM {{ source_tables[0] }}
  $$
);

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_version: 2.0.0              # Required: Must be "2.0.0"
spec_type: code_spec            # Required: Must be "code_spec"
name: <identifier>              # Required: Unique name of this code bundle.
version: <version_id>           # Required: Alphanumeric with underscores (max 20 chars)
description: <description_text> # Optional: Description (max 1,000 chars)

artifacts:                      # Optional: Staged files for import
  - alias: <identifier>         # One or more artifact items...
    stage_path: <stage_path>    # Required: Full stage path. See below for additional requirements.
    description: <description_text>  # Optional: Description (max 500 chars)
    content_hash: <sha256_hash>      # Optional: SHA-256 hash for integrity verification

functions:                      # Required if no procedures defined
  - name: <identifier>          # One or more functions...
    type: UDF | UDTF            # Required: Function type
    language: PYTHON            # Required: Currently only PYTHON supported
    runtime_version: <python_version>  # Optional: Python runtime (3.10 - 3.14)
    handler: <handler>          # Required: Handler function
    arguments:                  # Optional: One or more function arguments
      - name: <arg_name>        # Argument name
        type: <sql_type>        # Snowflake SQL type of this argument
    returns: <sql_type>         # Required: Snowflake return type
    packages:                   # Optional: Package dependencies
      - <package_name>          # One or more package items...
    imports:                    # Optional: Artifact aliases to import
      - <artifact_alias>        # One or more import items...
    code_body: |                # Optional: Inline Python code (max 12 MB)
      <inline_python_code>
    description: <description_text>  # Optional: Description of this function.

procedures:                     # Required if no functions defined
  - name: <identifier>          # One or more procedure items...
    language: PYTHON            # Required: Currently only PYTHON supported
    runtime_version: <python_version>  # Optional: Python runtime version
    handler: <handler>          # Required: Handler function
    arguments:                  # Optional: One or more procedure arguments
      - name: <arg_name>        # Argument name
        type: <sql_type>        # Snowflake SQL type of this argument
    returns: <sql_type>         # Optional: Return type
    packages:                   # Optional: Package dependencies
      - <package_name>          # One or more package items...
    imports:                    # Optional: Artifact aliases to import
      - <artifact_alias>        # One or more import items...
    code_body: |                # Optional: Inline Python code
      # inline python_code ...
    description: <description_text>  # Optional: Description of this procedure.
api_version

Version de l’API de collaboration utilisée. Doit être 2.0.0.

spec_type

Identificateur du type de spécification. Doit être code_spec.

name: identifier

Un 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_name

version: version_id

Identificateur 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: identifier

Un 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_path

Chemin 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 = TRUE dé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 REFRESH pour 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 identifier

Le nom de la fonction à exposer au modèle appelant. Doit être un identificateur Snowflake valide.

type

Le type de fonction. L’un des rôles suivants : UDF ou UDTF.

language

La langue de la fonction. Actuellement, seulement PYTHON est 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: handler

Le nom de la fonction de gestionnaire dans le code de la fonction à appeler lorsque name est 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_type

Le type de retour. Pour les UDFs, utilisez un type SQL tel que STRING ou FLOAT. Pour UDTFs, utilisez TABLE(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 champ type.

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

REGISTER_CODE_SPEC( ['<registry_name>' ,] <code_spec> )

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_spec

Dé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 :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  description: Custom UDF for data normalization

  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      runtime_version: "3.10"
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
        - name: min_val
          type: FLOAT
        - name: max_val
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value, min_val, max_val):
            if max_val == min_val:
                return 0.0
            return (value - min_val) / (max_val - min_val)
  $$
);

Enregistrer un bundle de code dans un registre personnalisé :

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.REGISTER_CODE_SPEC(
  'my_custom_registry',
  $$
  api_version: 2.0.0
  spec_type: code_spec
  name: custom_udf
  version: v1
  description: Custom UDF for data normalization

  functions:
    - name: normalize_value
      type: UDF
      language: PYTHON
      runtime_version: "3.10"
      handler: normalize
      arguments:
        - name: value
          type: FLOAT
        - name: min_val
          type: FLOAT
        - name: max_val
          type: FLOAT
      returns: FLOAT
      code_body: |
        def normalize(value, min_val, max_val):
            if max_val == min_val:
                return 0.0
            return (value - min_val) / (max_val - min_val)
  $$
);

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

VIEW_REGISTERED_CODE_SPECS( [ '<registry_name>' ] )

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

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.VIEW_REGISTERED_CODE_SPECS();

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

VIEW_CODE_SPECS( <collaboration_name> )

Arguments

collaboration_name

ID 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

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_CODE_SPECS(
  $collaboration_id
);

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 :

api_version: 2.0.0
spec_type: code_spec
name: string_utils
version: v1
description: String utility functions

functions:
  - name: clean_string
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: clean
    arguments:
      - name: input_str
        type: STRING
    returns: STRING
    description: Removes leading/trailing whitespace and converts to lowercase
    code_body: |
      def clean(input_str):
          if input_str is None:
              return None
          return input_str.strip().lower()

  - name: extract_domain
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: extract
    arguments:
      - name: email
        type: STRING
    returns: STRING
    description: Extracts domain from email address
    code_body: |
      def extract(email):
          if email is None or '@' not in email:
              return None
          return email.split('@')[1]

UDTF (Fonction de table définie par l’utilisateur)

Cet exemple de YAML définit une UDTF qui renvoie plusieurs lignes :

api_version: 2.0.0
spec_type: code_spec
name: tokenizer
version: v1
description: Text tokenization UDTF

functions:
  - name: tokenize_text
    type: UDTF
    language: PYTHON
    runtime_version: "3.10"
    handler: Tokenizer
    arguments:
      - name: text
        type: STRING
      - name: delimiter
        type: STRING
    returns: TABLE(token STRING, position INTEGER)
    description: Splits text into tokens and returns each with its position
    code_body: |
      class Tokenizer:
          def process(self, text, delimiter):
              if text is None:
                  return
              tokens = text.split(delimiter if delimiter else ' ')
              for i, token in enumerate(tokens):
                  yield (token.strip(), i)

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 :

api_version: 2.0.0
spec_type: code_spec
name: ml_scoring
version: v2
description: ML scoring functions using custom library

artifacts:
  - alias: ml_lib
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/libs/ml_scoring_lib-1.0.0-py3-none-any.whl"
    description: Custom ML scoring library
    content_hash: "a1b2c3d4e5f6..."

functions:
  - name: predict_score
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: ml_scoring_lib.predictor.predict
    arguments:
      - name: features
        type: ARRAY
    returns: FLOAT
    packages:
      - numpy
      - scikit-learn
    imports:
      - ml_lib
    description: Predicts score using trained ML model

Procédure stockée

Cet exemple de YAML définit une procédure stockée pour le traitement des données :

api_version: 2.0.0
spec_type: code_spec
name: data_processor
version: v1
description: Data processing procedures

procedures:
  - name: aggregate_metrics
    language: PYTHON
    runtime_version: "3.10"
    handler: process
    arguments:
      - name: table_name
        type: STRING
      - name: group_column
        type: STRING
    returns: STRING
    packages:
      - snowflake-snowpark-python
    description: Aggregates metrics by specified column
    code_body: |
      def process(session, table_name, group_column):
          df = session.table(table_name)
          result = df.group_by(group_column).count()
          result.write.mode("overwrite").save_as_table("aggregated_results")
          return f"Aggregated {df.count()} rows into aggregated_results"

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 :

api_version: 2.0.0
spec_type: code_spec
name: analytics_suite
version: v3
description: Analytics suite with multiple modules

artifacts:
  - alias: utils
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/utils.py"
    description: Utility functions
  - alias: transformers
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/transformers.py"
    description: Data transformation functions
  - alias: validators
    stage_path: "@MY_DB.PUBLIC.CODE_STAGE/analytics/validators.py"
    description: Validation functions

functions:
  - name: transform_and_validate
    type: UDF
    language: PYTHON
    runtime_version: "3.10"
    handler: transformers.transform_validate
    arguments:
      - name: data
        type: OBJECT
    returns: OBJECT
    imports:
      - utils
      - transformers
      - validators
    description: Transforms and validates input data

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.