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:
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.
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: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
RUNals 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:
Suchen Sie den Namen der Clean Room-Anwendung, in der Sie versuchen, das Code-Bundle bereitzustellen:
Überprüfen Sie den Wert für
upgrade_statein 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:
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:
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:
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:
Ü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:
Schritt 2: Aktualisieren und registrieren Sie die neue Version Ihres Code-Bundles und aktualisieren Sie dann Ihre Vorlage, um die neue Version zu verwenden:
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_versionDie verwendete Version der Collaboration API. Sie müssen
2.0.0sein.spec_typeBezeichner des Spezifikationstyps. Sie müssen
code_specsein.name: identifierEin 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_nameversion: version_idKundenspezifischer 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: identifierEin 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_pathVollstä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 = TRUEfestgelegt sein.Format des Stagingbereichspfads: Muss dem Format
@[DB.]SCHEMA.STAGE/path/to/file.extfolgen.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 REFRESHaufrufen, 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 identifierDer Funktionsname, der in der aufrufenden Vorlage angezeigt werden soll. Muss ein gültiger Snowflake-Bezeichner sein.
typeDer Funktionstyp. Eine der folgenden Optionen:
UDFoderUDTF.languageDie Programmiersprache der Funktion. Derzeit wird nur
PYTHONunterstützt.runtime_version: python_version(Optional)Die zu verwendende Python-Laufzeitversion. Unterstützte Versionen:
3.10bis3.14.handler: handlerDer Name der Handler-Funktion im Funktionscode, die aufgerufen werden soll, wenn
namelautet.arguments(Optional)Funktionsargumente als Liste von Name-Typ-Paaren. Die Typen müssen gültige Snowflake-SQL-Typen sein.
returns: sql_typeDer Rückgabetyp. Verwenden Sie für UDFs einen SQL-Typ wie
STRINGoderFLOAT. Für UDTFs verwenden SieTABLE(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 keintype-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¶
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_specDefinition 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:
Registrieren eines Code-Bundles in einer kundenspezifischen Registry:
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¶
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¶
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¶
Argumente¶
collaboration_nameDie 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¶
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:
UDTF (Benutzerdefinierte Tabellenfunktionen)¶
Dieses Beispiel-YAML definiert eine UDTF, die mehrere Zeilen zurückgibt:
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:
Gespeicherte Prozeduren¶
Dieses Beispiel-YAML definiert eine gespeicherte Prozedur für die Datenverarbeitung:
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:
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.