Einführung in Python-UDFs¶
Unter diesem Thema werden Python-UDFs vorgestellt, und Sie erhalten Informationen, die Ihnen bei der Entscheidung helfen, wann Sie eine Python-UDF verwenden sollten.
Unter diesem Thema:
Was ist eine Python-UDF?¶
Eine UDF (benutzerdefinierte Funktion) ist eine vom Benutzer geschriebene Funktion, die von Snowflake aus auf die gleiche Weise wie eine integrierte Funktion aufgerufen werden kann.
In Snowflake können UDFs in unterschiedlichen Sprachen, einschließlich Python, geschrieben werden.
Python-UDFs sind skalare Funktionen, wobei für jede Zeile, die an die UDF übergeben wird, von der UDF ein Wert zurückgegeben wird.
UDFs akzeptieren keine oder mehr Parameter.
Wenn ein Benutzer eine UDF aufruft, übergibt der Benutzer den Namen der UDF und die Parameter der UDF an Snowflake. Wenn die UDF eine Python-UDF ist, ruft Snowflake den entsprechenden Python-Code (Handler-Methode genannt) auf. Die Handler-Methode gibt dann die Ausgabe an Snowflake zurück, und Snowflake gibt die Ausgabe an den Client zurückgibt.
Python-UDFs können sowohl neuen Code enthalten als auch Aufrufe bestehender Pakete, was sowohl Flexibilität als auch die Wiederverwendung von Code ermöglicht. Wenn Sie z. B. bereits Datenanalysecode in Python haben, dann können Sie diesen wahrscheinlich in eine Python-UDF einbinden.
Snowflake unterstützt derzeit das Schreiben von UDFs in der Python-Version 3.8.
Durch eine Partnerschaft mit Anaconda können von Snowflake Python-Pakete von Drittanbietern bereitgestellt werden. Weitere Informationen dazu finden Sie unter Verwenden von Drittanbieter-Paketen.
Bemerkung
Mithilfe der Python-UDF-Batch-API können Sie Python-Funktionen definieren, die Batches von Eingabezeilen als Pandas DataFrames empfangen und Batches von Ergebnissen als Pandas-Arrays oder Pandas Series zurückgeben. Weitere Informationen dazu finden Sie unter Python-UDF-Batch-API.
Entscheiden, wann ein Python-UDF verwendet werden soll¶
Weitere Informationen zu anderen möglichen Sprachen, in denen UDFs geschrieben werden können, und für Vergleiche zwischen diesen Sprachen finden Sie unter Übersicht zu UDFs.
Informationen zu andere Methoden zur Erweiterung von Snowflake finden Sie unter:
Vorteile von Python-UDFs¶
Python-UDFs sind besonders geeignet, wenn einer oder mehrere der folgenden Punkte zutreffen:
Sie haben bereits Python-Code (Quellcode oder kompiliert), den Sie verwenden können.
Ihr Code verwendet (oder könnte verwenden) Funktionen, die bereits in Standard-Python-Paketen vorhanden sind.
Sie kennen Python so gut wie oder besser als die anderen Sprachen, die UDFs unterstützen.
Sie möchten die Vorteile des umfassenden Drittanbieter-Ökosystems von Python nutzen.
Einschränkungen bei Python-UDFs¶
Allgemeine Einschränkungen¶
Obwohl Ihre Python-Funktion Module und Funktionen in den Standard-Python-Paketen verwenden kann, werden durch die Snowflake-Sicherheitseinschränkungen einige Features deaktiviert, wie z. B. der Netzwerkzugriff und das Schreiben in Dateien. Weitere Informationen dazu finden Sie im Abschnitt Einsetzen von bewährten Sicherheitsmethoden.
Alle UDFs und Module, die über Stagingbereich eingebracht werden, müssen plattformunabhängig sein und dürfen keine nativen Erweiterungen enthalten.
Vermeiden Sie Code, der eine bestimmte CPU-Architektur voraussetzt (z. B. x86).
Vermeiden Sie Code, der ein bestimmtes Betriebssystem voraussetzt.
Python-UDFs können nicht freigegeben werden. Datenbankobjekte, die Python-UDFs verwenden, können ebenfalls nicht freigegeben werden. So ist Folgendes zum Beispiel nicht möglich:
Direktes Freigeben einer Python-UDF.
Freigeben einer Ansicht, die eine Python-UDF aufruft.
Freigeben einer Funktion, die eine Python-UDF aufruft.
Freigeben einer Tabelle mit einer Maskierungs- oder Zeilenzugriffsrichtlinie, die eine Python-UDF aufruft.
Durch Erteilen der USAGE-Berechtigung für eine Python-UDF kann der Empfänger den Inhalt von Dateien anzeigen, die von dieser UDF importiert wurden. Wenn Sie einer Rolle die USAGE-Berechtigung für eine Python-UDF erteilen und diese Rolle eine Anweisung ausführt, die diese Python-UDF aufruft, könnte jede Python-UDF in derselben Anweisung den Inhalt aller Dateien lesen, die von der Python-UDF importiert wurden, für die Sie eine USAGE-Berechtigung erteilt haben.
Die Datenbankreplikation für Inline-Python-UDFs wird unterstützt. Die Replikation wird jedoch blockiert, wenn eine Python-UDF eine Abhängigkeit zu einer Datei in einem Stagingbereich aufweist (d. h. zu einer Funktion, die mit der IMPORTS-Klausel erstellt wurde). Diese Einschränkung entfällt möglicherweise in zukünftigen Versionen.
Snowflake verwendet das Python-Modul
zipimport
, um Python-Code aus Stagingbereichen zu importieren. Infolgedessen werden allezipimport
-Einschränkungen auch für UDFs gelten. Weitere Informationen zuzipimport
-Modul finden Sie in der zipimport-Referenz.
Einschränkungen beim Klonen¶
Eine Python-UDF kann geklont werden, wenn die Datenbank oder das Schema, das die Python-UDF enthält, geklont wird. Um geklont zu werden, muss eine Python-UDF die folgenden Bedingungen erfüllen:
Wenn die Python-UDF auf einen Stagingbereich verweist, muss sich dieser Stagingbereich außerhalb des Schemas (oder der Datenbank) befinden, das (die) geklont wird.
Sie können eine Python-UDF und deren referenzierte Stagingbereiche in getrennten Schemas (und/oder getrennten Datenbanken) auf eine der folgenden Arten speichern:
Verwenden Sie überall dort, wo die Python-UDF auf einen Stagingbereich verweist, einen qualifizierten Stagingbereichsnamen (z. B. „my_db.my_schema.my_stage()“), der sich von dem Schema oder der Datenbank der Python-UDF unterscheidet. Wenn die Klonoperation eine Datenbank klont, muss der Stagingbereichsverweis die Datenbank und das Schema enthalten. Wenn die Klonoperation ein Schema klont, muss der Stagingbereichsverweis das Schema (und optional die Datenbank) enthalten.
Erstellen Sie den referenzierten Stagingbereich unter Verwendung eines nicht qualifizierten Stagingbereichsnamens (der implizit die aktive Datenbank und das aktive Schema der aktuellen Sitzung verwendet), und erstellen Sie die Python-UDF unter Verwendung eines qualifizierten Namens, der nicht mit der aktuellen Datenbank und dem aktuellen Schema der Sitzung übereinstimmt.
Verwenden Sie den Stagingbereich des Benutzers als referenzierten Stagingbereich (der Stagingbereich des Benutzers ist von allen anderen Stagingbereichen der Datenbank oder des Schemas getrennt).
Wenn eine oder mehrere Python-UDFs im Schema oder in der Datenbank die erforderlichen Bedingungen nicht erfüllen, kann das Schema oder die Datenbank trotzdem geklont werden, wobei die nicht konformen Python-UDFs allerdings ohne Fehler- oder Warnmeldung ausgelassen werden.
Jede geklonte Python-UDF hat die gleiche Definition wie das Original. Diese Definition schließt alle Verweise auf Stagingbereiche ein. Die Stagingbereichsverweise in der Python-UDF müssen vollqualifiziert sein und sind daher absolut und nicht relativ zu dem Schema oder der Datenbank, die geklont wird. Da sowohl Original als auch Klon auf dieselben Stagingbereiche und Dateien verweisen, gilt Folgendes:
Wenn Sie den Stagingbereich löschen oder erforderliche Dateien aus dem Stagingbereich entfernen, werden sowohl die Original- als auch die geklonte-UDF deaktiviert.
Das Ändern des Stagingbereichs oder der Dateien im Stagingbereich wirkt sich sowohl auf die Original- als auch auf die geklonte UDF-Datei aus.