Hochladen und Verwenden von benutzerdefinierten Funktionen in Collaboration Clean Rooms

Einführung

Jeder Teilnehmende kann kundenspezifische Python-UDFs und UDTFs in eine Zusammenarbeit hochladen. Vorlagen in der Zusammenarbeit können diese Funktionen ausführen, um komplexe Datenaktionen durchzuführen. Zu den üblichen Verwendungszwecken gehören maschinelles Lernen oder die angepasste Datenmanipulation innerhalb einer Abfrage. Ihr hochgeladener Code kann Pakete aus einem genehmigten Bundle von Python-Paketen und den Snowpark API-Paketen importieren und verwenden.

Bemerkung

Python ist die einzige Codierungssprache, die kundenspezifische UDFs unterstützt.

Die folgenden Abschnitte zeigen, wie Sie eine benutzerdefinierte Funktion hochladen und verwenden.

Definieren und Verwenden von kundenspezifischen Code-Bundles

So laden Sie eine benutzerdefinierte Funktion hoch und verwenden sie:

Der Codeüberstellende:

  1. Erstellt und registriert den Code durch Aufrufen von:ref:REGISTER_CODE_SPEC<label-dcr_collab_register_code_spec>.

    Der Code kann inline in der Spezifikation eingebettet sein oder über einen Stagingbereich verknüpft werden.

  2. Erstellt eine Vorlage mit Verweis auf die Code-Bundle-Spezifikation anhand der ID im code_specs-Array der Vorlage. Fügen Sie dieses Feld als Peer der Felder „Vorlage“ und „Parameter“ hinzu, wie im folgenden Beispiel gezeigt:

     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. Registriert die Vorlage und verknüpft die Vorlage dann mit der Zusammenarbeit.

    Bemerkung

    Snowflake überprüft den hochgeladenen Code auf Sicherheitsprobleme. Wenn ein Sicherheitsproblem gefunden wird, werden der Code und die enthaltene Vorlage nicht zur Zusammenarbeit hinzugefügt.

Der Analyseausführende:

  • Führt die Vorlage aus, indem er RUN als Standardmethode aufruft.

Wichtig

Snowflake führt Sicherheitsprüfungen für alle hochgeladenen Bundles durch, bevor sie in einem Clean Room eingesetzt werden. Wenn eine Sicherheitsprüfung fehlschlägt, werden die Vorlage und der gebündelte Code nicht bereitgestellt und stehen nicht zur Verfügung.

Um zu bestätigen, dass eine Vorlage mit einem Code-Bundle bereitgestellt und einsatzbereit ist, führen Sie die folgenden Schritte aus:

  1. Suchen Sie den Namen der Clean Room-Anwendung, in der Sie versuchen, das Code-Bundle bereitzustellen:

    SHOW APPLICATIONS LIKE 'SFDCR_<collaboration name>';
    
  2. Überprüfen Sie den Wert für upgrade_state in der DESCRIBE APPLICATION-Antwort. Wenn der Upgrade-Status COMPLETE lautet, wurden die Sicherheitsprüfungen bestanden und die neue Vorlage und das Bundle können verwendet werden. Übergeben Sie den Anwendungsnamen, der vom Befehl im vorherigen Schritt zurückgegeben wurde, mit SQL wie im folgenden Beispiel: SQL-Code:

    DESCRIBE APPLICATION <application name>
    

Erstellen und Registrieren der Code-Bundle-Spezifikation

Der erste Schritt beim Hochladen von kundenspezifischem Code besteht darin, die Code-Bundle-Spezifikation zu erstellen und zu registrieren.

Benutzerdefinierte Funktionen werden in einer YAML-Code-Bundle-Spezifikation definiert. Jedes Code-Bundle stellt eine oder mehrere Funktionen zur Verfügung, die von einer Vorlage aufgerufen werden können. Die Code-Bundle-Spezifikation kann entweder den Code inline in der Spezifikation enthalten oder mit Code in einem Snowflake-Stagingbereich verknüpft sein.

Ein Teilnehmender registriert eine Spezifikation durch den Aufruf von REGISTRY.REGISTER_CODE_SPEC, wodurch die Bundle-ID zurückgegeben wird. Jeder Teilnehmende mit einer beliebigen Rolle kann ein Code-Bundle registrieren und verknüpfen.

Nachdem das Code-Bundle mit der Zusammenarbeit verknüpft wurde, ist dieses Code-Bundle für jeden in der Zusammenarbeit sichtbar, der auf eine Vorlage zugreifen kann, die das Code-Bundle verknüpft. Rufen Sie VIEW_CODE_SPECS auf, um zugängliche Code-Bundles in einer Zusammenarbeit aufzulisten.

Jede Person, die ein Code-Bundle in einer Zusammenarbeit sehen kann, kann es in ihren eigenen Vorlagen in dieser Zusammenarbeit sehen und verwenden. Jeder Inline-Code kann von jedem Mitglied der Zusammenarbeit angezeigt werden, aber Stagingbereich-Artefaktcode kann nicht von Teilnehmenden angezeigt werden.

Die folgende Code-Bundle-Spezifikation stellt eine einzelne Python-UDF namens normalize_value zur Verfügung, wodurch die normalize-Funktion aufgerufen wird, die in dieser Spezifikation definiert ist:

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
  $$
);

Erstellen und Registrieren der aufrufenden Vorlage

Nachdem die Codespezifikation registriert wurde, registriert der Teilnehmende dann eine Vorlage, die dieses Code-Bundle verwendet. Um ein Code-Bundle zu verwenden, fügen Sie die ID der Bundle-Spezifikation in das Feld code_specs der Vorlage ein.

Eine Vorlage ruft eine benutzerdefinierte Funktion mit der Syntax cleanroom.spec_name$function_name auf. Beachten Sie die Literale . und``$`` zur Namensbereichskennzeichnung.

Bemerkung

Verwenden Sie den Namen der Spezifikation, nicht die Spezifikations-ID, um auf eine Funktion in Ihrer Vorlage zu verweisen.

Im folgenden Beispiel verwendet eine Vorlage die Funktion normalize_value aus dem Code-Bundle 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] }}
  $$
);

Hinzufügen einer Vorlage zu einer Zusammenarbeit

Fügen Sie die Vorlage, die Ihre Funktion aufruft, auf die standardmäßige Weise zur Zusammenarbeit hinzu. Weitere Informationen dazu finden Sie unter Vorlagen.

Snowflake validiert und lädt die Daten in die Zusammenarbeit hoch, wenn die aufrufende Vorlage zu einer Zusammenarbeit hinzugefügt wird. Snowflake scannt den hochgeladenen Code auf Sicherheitsprobleme, bevor der Code installiert wird.

Das folgende Beispiel zeigt eine Anforderung zum Hinzufügen einer Vorlage zu einer bestehenden Zusammenarbeit:

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

Übermitteln einer neue Version Ihres Code-Bundles

Jede registrierte Codespezifikation muss einen eindeutigen Namen + Version für alle Registrys in Ihrem Konto haben. Eine Vorlage lädt einen bestimmten Namen und eine Version einer Codespezifikation. Wenn Sie eine neue Version Ihres Codes erstellen oder verwenden möchten, müssen Sie eine neue Version der Vorlage übermitteln, die im Feld „code_specs“ auf die neue Codeversion verweist. Sie müssen den Textteil der Vorlage nicht ändern. Beispiel:

Schritt 1: Verwenden Sie Version 1 des Code-Bundles:

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] }}
  $$
);

Schritt 2: Aktualisieren und registrieren Sie die neue Version Ihres Code-Bundles und aktualisieren Sie dann Ihre Vorlage, um die neue Version zu verwenden:

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] }}
  $$
);

Beachten Sie, dass Funktionsnamen nicht die Version enthalten, sodass Sie den aufrufenden Code im Vorlagentext nicht ändern müssen, wenn Sie eine neue Version einer Funktion hochladen.

Code-Bundle-Spezifikation

Diese Spezifikation definiert ein Bundle von einer oder mehreren Codefunktionen oder Prozeduren, die von einer Vorlage aufgerufen werden können.

Eine Code-Bundle-Spezifikation enthält maximal 5 Funktionen plus Prozeduren.

Für Bezeichner in der Code-Bundle-Spezifikation gelten die folgenden allgemeinen Anforderungen:

  • Namen: Müssen gültige Snowflake-Bezeichner sein, die mit einem Buchstaben beginnen und nur alphanumerische Zeichen und Unterstriche enthalten.

  • Bezeichner in Anführungszeichen: Bezeichner in doppelten Anführungszeichen werden für Namen mit Sonderzeichen unterstützt.

  • Unterscheidung nach Groß-/Kleinschreibung: Bei Bezeichnern ohne Anführungszeichen ist die Groß- und Kleinschreibung nicht relevant. Bei Bezeichnern in Anführungszeichen wird die Groß-/Kleinschreibung beibehalten.

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

Die verwendete Version der Collaboration API. Sie müssen 2.0.0 sein.

spec_type

Bezeichner des Spezifikationstyps. Sie müssen code_spec sein.

name: identifier

Ein eindeutiger Name für diese Code-Bundle-Spezifikation innerhalb dieser Registry. Muss ein gültiger Snowflake-Bezeichner mit maximal 75 Zeichen sein. Dies wird als Nachnamesegment verwendet, wenn Sie die Funktion in einer Vorlage aufrufen: cleanroom.code_spec_name$function_name

version: version_id

Kundenspezifischer Versionsbezeichner. Muss alphanumerisch mit Unterstrichen sein;maximal 20 Zeichen.

description: description_text (Optional)

Eine Beschreibung der Code-Bundle-Spezifikation (maximal 1.000 Zeichen).

artifacts (Optional)

Eine Liste der Stagingdateien oder -pakete, die von Ihren Funktionen oder Prozeduren importiert werden können, und optional über Handler-Funktionen verfügbar sind. Maximal 5 pro Spezifikation.

alias: identifier

Ein Alias zum Referenzieren dieses Artefakts in Importen. Wenn Sie innerhalb dieser Spezifikation auf diesen Alias verweisen, verwenden Sie den reinen Aliasnamen und nicht cleanroom.spec_name$alias; verwenden Sie also den reinen Funktionsnamen, um auf eine andere Funktion in dieser Spezifikation zu verweisen.

stage_path: stage_path

Vollständiger Stagingbereichspfad zur Artefaktdatei; Beispiel:@DB.SCHEMA.STAGE/path/file.whl.

  • Der Stagingbereich muss ein interner Stagingbereich sein. Externe Stagingbereiche werden nicht unterstützt.

  • Für den Stagingbereich muss DIRECTORY aktiviert sein: Für den Stagingbereich, der Artefakte enthält, muss DIRECTORY = TRUE festgelegt sein.

  • Format des Stagingbereichspfads: Muss dem Format @[DB.]SCHEMA.STAGE/path/to/file.ext folgen.

  • Kein Durchlaufpfad: Stagingbereichspfade dürfen nicht .. oder \ enthalten.

  • Dieses Artefakt muss vorhanden sein: Die Datei muss im angegebenen Stagingbereichspfad vorhanden sein, wenn das Code-Bundle registriert wird.

  • Für den Stagingbereich muss die serverseitigeSNOWFLAKE_SSE-Verschlüsselung aktiviert sein. Legen Sie beim Erstellen oder Ändern des Stagingbereichs ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE') fest.

  • Wenn Sie eine Staging-Codedatei verschieben, löschen oder aktualisieren, müssen Sie ALTER STAGE stage name REFRESH aufrufen, um sicherzustellen, dass die Zusammenarbeit über die neuesten Informationen aus dem Stagingbereich verfügt. Code-Aktualisierungen werden nur unterstützt, bevor Sie die Code-Spezifikation registrieren, da an diesem Punkt die Version zugewiesen und die Hash-Prüfsumme berechnet wird.

description: description_text (Optional)

Eine Beschreibung des Artefakts (maximal 500 Zeichen).

content_hash: sha256_hash (Optional)

SHA-256 Hash für die Integritätsprüfung (64 Hexadezimalzeichen).

functions (Erforderlich, wenn keine Prozeduren definiert sind)

Eine Liste von UDF- oder UDTF-Definitionen.

name identifier

Der Funktionsname, der in der aufrufenden Vorlage angezeigt werden soll. Muss ein gültiger Snowflake-Bezeichner sein.

type

Der Funktionstyp. Eine der folgenden Optionen: UDF oder UDTF.

language

Die Programmiersprache der Funktion. Derzeit wird nur PYTHON unterstützt.

runtime_version: python_version (Optional)

Die zu verwendende Python-Laufzeitversion. Unterstützte Versionen: 3.10 bis 3.14.

handler: handler

Der Name der Handler-Funktion im Funktionscode, die aufgerufen werden soll, wenn name lautet.

arguments (Optional)

Funktionsargumente als Liste von Name-Typ-Paaren. Die Typen müssen gültige Snowflake-SQL-Typen sein.

returns: sql_type

Der Rückgabetyp. Verwenden Sie für UDFs einen SQL-Typ wie STRING oder FLOAT. Für UDTFs verwenden Sie TABLE(column_definitions):

packages (Optional)

Eine Liste der von diesem Code verwendeten Pakete. Dabei kann es sich um eines dieser Anaconda Python-Pakete oder dieser Snowpark API-Pakete handeln. Beispiel: snowflake-snowpark-python, numpy.

imports (Optional)

Eine Liste der zu importierenden Artefakte. Dies müssen Aliasse aus der Artefaktliste in dieser Spezifikation sein.

code_body (Optional)

Inline-Python-Code. Gegenseitig ausschließend mit Stagingimporten. Die maximale Größe beträgt 12 MB.

description: description_text (Optional)

Eine Beschreibung der Funktion (maximal 500 Zeichen).

procedures (Erforderlich, wenn keine Funktionen definiert sind)

Eine Liste der Definitionen der gespeicherten Prozeduren. Felder sind ähnlich wie bei functions, außer dass es kein type-Feld gibt.

API-Referenz

Die folgenden Prozeduren werden verwendet, um kundenspezifische Code-Bundles in einer Zusammenarbeit zu verwalten:

REGISTER_CODE_SPEC

Schema:

REGISTRY

Registriert ein Code-Bundle. Dies speichert den Code in der Clean Room-Umgebung in der Tabelle REGISTRY.CODE_SPECS. Nachdem eine Codespezifikation registriert wurde, kann sie von einer Vorlage verwendet werden.

Jede registrierte Codespezifikation muss einen eindeutigen Namen + Version für alle Registrys in Ihrem Konto haben.

Syntax

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

Argumente

registry_name (Optional)

Name einer kundenspezifischen Registry, in der diese Codespezifikation registriert werden soll. Wenn nicht angegeben, wird die Codespezifikation in der standardmäßigen Konto-Registry registriert.

code_spec

Definition der Code-Bundle-Spezifikation im YAML-Format als Zeichenfolge.

Rückgabewerte

Die ID der generierten Code-Bundle-Spezifikation.

Beispiele

Registrieren eines Code-Bundles in der Standard-Registry:

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)
  $$
);

Registrieren eines Code-Bundles in einer kundenspezifischen Registry:

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)
  $$
);

Zugriffsanforderungen

Wenn Sie nicht die Rolle SAMOOHA_APP_ROLE verwenden, müssen Sie eine Rolle verwenden, der eine der folgende Berechtigungen erteilt wurde:

So registrieren Sie eine Codespezifikation in der Standard-Registry:

  • GRANT_PRIVILEGE_ON_ACCOUNT_TO_ROLE('REGISTER CODE SPEC', 'role name')

So registrieren Sie Elemente in einer kundenspezifischen Registry:

  • Sie haben Lese- und Schreibberechtigungen für jede kundenspezifische Registry, die Sie selbst erstellt haben.

  • Um auf eine von einem anderen Benutzenden erstellte kundenspezifische Registry zuzugreifen, benötigen Sie GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('REGISTER', 'REGISTRY', 'MY_REGISTRY', 'role name').


VIEW_REGISTERED_CODE_SPECS

Schema:

REGISTRY

Listet alle Code-Bundle-Spezifikationen auf, die von dieser Rolle in der lokalen Konto-Registry registriert wurden.

Syntax

VIEW_REGISTERED_CODE_SPECS( [ '<registry_name>' ] )

Argumente

registry_name (Optional)

Name einer kundenspezifische Registry zum Auflisten von Codespezifikationen. Wenn nicht angegeben, werden Codespezifikationen aus der Standardkonto-Registry aufgelistet.

Rückgabewerte

Eine Tabelle, die die Details aller Codespezifikationen auflistet, die Sie in diesem Konto registriert haben. Die Tabelle enthält die folgenden Spalten:

  • CODE_SPEC_ID: ID der Code-Bundle-Spezifikation.

  • NAME: Name der Code-Bundle-Spezifikation.

  • VERSION: Version der Code-Bundle-Spezifikation.

  • CODE_SPEC: Vollständige YAML-Spezifikation der Code-Bundle-Spezifikation.

Beispiel

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.REGISTRY.VIEW_REGISTERED_CODE_SPECS();

Zugriffsanforderungen

Wenn Sie nicht die Rolle SAMOOHA_APP_ROLE verwenden, müssen Sie eine Rolle verwenden, der eine der folgende Berechtigungen erteilt wurde:

So zeigen Sie Elemente in der Standard-Registry an:

  • 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')

So zeigen Sie Elemente in einer bestimmten Registry an:

  • Sie haben Lese- und Schreibberechtigungen für jede kundenspezifische Registry, die Sie selbst erstellt haben.

  • Um auf eine von einem anderen Benutzenden erstellte kundenspezifische Registry zuzugreifen, benötigen Sie GRANT_PRIVILEGE_ON_OBJECT_TO_ROLE('READ', 'REGISTRY', 'MY_REGISTRY', 'role name').


VIEW_CODE_SPECS

Schema:

COLLABORATION

Gibt alle Code-Bundle-Spezifikationen zurück, die von einer beliebigen Vorlage referenziert werden, die Sie erstellt haben oder die in der angegebenen Zusammenarbeit ausgeführt werden können.

Syntax

VIEW_CODE_SPECS( <collaboration_name> )

Argumente

collaboration_name

Die ID der Zusammenarbeit.

Rückgabewerte

Eine Tabelle, die die in der angegebenen Zusammenarbeit verfügbaren Code-Bundles auflistet. Die Tabelle enthält die folgenden Spalten:

  • CODE_SPEC_ID: ID dieser Code-Bundle-Spezifikation.

  • CODE_SPEC: Vollständige YAML-Spezifikation der Code-Bundle-Spezifikation.

  • SHARED_BY: Teilnehmeralias, der die Code-Bundle-Spezifikation freigegeben hat.

Beispiel

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.COLLABORATION.VIEW_CODE_SPECS(
  $collaboration_id
);

Zugriffsanforderungen

Wenn Sie nicht die Rolle SAMOOHA_APP_ROLE verwenden, müssen Sie eine Rolle verwenden, der eine der folgende Berechtigungen erteilt wurde:

  • 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')

Beispielspezifikationen

Inline-UDF mit Codetext

Eine einfache UDF mit Inline-Python-Code:

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 (Benutzerdefinierte Tabellenfunktionen)

Dieses Beispiel-YAML definiert eine UDTF, die mehrere Zeilen zurückgibt:

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)

Staging-Artefakt mit Wheel-Paket

Lesen Sie unbedingt die Anforderungen an die Dokumentation von stage_path zur Verknüpfung mit Stagingcode in Ihrer Codespezifikation.

Dieses Beispiel-YAML verwendet ein Staging-Python-Wheel-Paket:

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

Gespeicherte Prozeduren

Dieses Beispiel-YAML definiert eine gespeicherte Prozedur für die Datenverarbeitung:

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"

Mehrere Python-Dateien als Staging-Artefakte

Lesen Sie unbedingt die Anforderungen an die Dokumentation von stage_path zur Verknüpfung mit Stagingcode in Ihrer Codespezifikation.

Dieses Beispiel-YAML verwendet mehrere Python-Quelldateien in einem Stagingbereich:

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

Problembehandlung bei Code-Bundles

Fehler:

CodeSpecAlreadyExistsException

Ursache:

Code-Bundle-Spezifikation mit demselben Namen und bereits registrierter Version.

Lösung:

Verwenden Sie eine andere Version oder aktualisieren Sie die bestehende Version.


 

Fehler:

SpecValidationError

Ursache:

YAML stimmt nicht mit dem Schema überein.

Lösung:

Überprüfen Sie die erforderlichen Felder und das Format.


 

Fehler:

CodeSpecStageNotAccessibleError

Ursache:

Der in Artefakt referenzierte Stagingbereich ist nicht zugänglich.

Lösung:

Gewähren Sie Zugriff auf den Stagingbereich oder überprüfen Sie, ob der Stagingbereich vorhanden ist.


 

Fehler:

CodeSpecArtifactNotFoundAtStageError

Ursache:

Datei nicht im angegebenen Stagingbereichspfad gefunden.

Lösung:

Laden Sie die Datei vor der Registrierung in den Stagingbereich hoch.


 

Fehler:

StageDirectoryNotEnabledError

Ursache:

DIRECTORY ist nicht für den Stagingbereich aktiviert.

Lösung:

Aktivieren Sie das Verzeichnis für den Stagingbereich: ALTER STAGE ... SET DIRECTORY = (ENABLE = TRUE)


 

Fehler:

CodeSpecNotFoundForOwnerException

Ursache:

Vorlage verweist auf nicht registrierte Code-Bundle-Spezifikation.

Lösung:

Registrieren Sie die Code-Bundle-Spezifikation, bevor Sie die Vorlage registrieren.