Vektorisierte Python-UDTFs¶
Dieses Thema bietet eine Einführung in vektorisierte Python-UDTFs.
Übersicht¶
Vektorisierte Python-UDTFs (benutzerdefinierte Tabellenfunktionen) bieten eine Möglichkeit, batchweise über Zeilen zu arbeiten.
Snowflake unterstützt zwei Arten von vektorisierten UDTFs:
UDTFs mit einer vektorisierten
end_partition-MethodeUDTFs mit einer vektorisierten
process-Methode
Sie müssen sich für eine Art entscheiden, da eine UDTF nicht sowohl eine vektorisierte process-Methode als auch eine vektorisierte end_partition-Methode haben kann.
UDTFs mit vektorisierter „end_partition“-Methode¶
UDTFs with a vectorized end_partition method enable seamless partition-by-partition processing by operating on
partitions as pandas DataFrames
and returning results as
pandas DataFrames
or lists of pandas arrays
or pandas Series.
This facilitates integration with libraries that operate on pandas DataFrames or pandas arrays.
Verwenden Sie eine vektorisierte end_partition-Methode für die folgenden Aufgaben:
Verarbeiten von Daten Partition für Partition und nicht Zeile für Zeile.
Rückgabe mehrerer Zeilen oder Spalten für jede Partition.
Verwenden von Bibliotheken, die für die Datenanalyse Pandas-DataFrames verwenden.
UDTFs mit einer vektorisierten Prozessmethode¶
UDTFs mit einer vektorisierten process-Methode bieten eine Möglichkeit, über Zeilen in Batches zu operieren, wenn die Operation eine 1:-1-Zuordnung ausführt. Mit anderen Worten, die Methode gibt für jede Eingabezeile genaue eine Ausgabezeile zurück. Die Anzahl der Spalten ist nicht beschränkt.
Verwenden Sie eine vektorisierte process-Methode für die folgenden Aufgaben:
Batchweises Anwenden einer 1-zu-1-Transformation mit einem mehrspaltigen Ergebnis.
Verwenden einer Bibliothek, die
pandas.DataFramebenötigt.Verarbeiten von Zeilen in Batches ohne explizite Partitionierung.
Nutzen von to_pandas()-API, um das Abfrageergebnis direkt in einen Pandas-DataFrame umzuwandeln.
Voraussetzungen¶
Die Snowpark-Bibliothek für Python, Version 1.14.0 oder höher ist erforderlich.
Erstellen Sie eine UDTF mit einer vektorisierten end_partition-Methode¶
Optional: Definieren Sie eine Handler-Klasse mit einer
__init__-Methode, die vor der Verarbeitung jeder Partition aufgerufen wird.Hinweis: Definieren Sie keine
process-Methode.Definieren Sie eine
end_partition-Methode, die ein DataFrame-Argument entgegennimmt und einpandas.DataFrameoder ein Tupel vonpandas.Seriesoderpandas.arrayszurückgibt oder ergibt, wobei jedes Array eine Spalte ist.Die Spaltentypen des Ergebnisses müssen mit den Spaltentypen der UDTF-Definition übereinstimmen.
Um die
end_partition-Methode als vektorisiert zu kennzeichnen, verwenden Sie das@vectorized-Decorator-Element oder das_sf_vectorized_input-Funktionsattribut.Weitere Informationen finden Sie unter Vektorisierte Python-UDFs. Das Decorator-Element
@vectorizedkann nur verwendet werden, wenn die Python-UDTF innerhalb von Snowflake ausgeführt wird, z. B. bei Verwendung eines SQL-Arbeitsblatts. Wenn Sie zum Ausführen den Client oder ein Python-Arbeitsblatt verwenden, müssen Sie das Funktionsattribut verwenden.
Bemerkung
Die Standard-Spaltennamen für den Eingabe-DataFrame einer UDTF mit vektorisierter end_partition-Methode entsprechen der Signatur der SQL-Funktion. Die Spaltennamen entsprechen den Anforderungen für SQL-Bezeichner. Das heißt, wenn ein Bezeichner nicht in Anführungszeichen steht, wird er groß geschrieben, und wenn er in doppelten Anführungszeichen steht, bleibt er unverändert.
Der folgende Codeblock ist ein Beispiel für die Erstellung einer UDTF mit einer vektorisierten end_partition-Methode unter Verwendung des @vectorized-Decorator-Elements:
Der folgende Codeblock ist ein Beispiel für die Erstellung einer UDTF mit einer vektorisierten end_partition-Methode unter Verwendung des Funktionsattributs:
Bemerkung
Ein UDTF mit einer vektorisierten end_partition-Methode muss mit einer PARTITION BY-Klausel aufgerufen werden, um die Partitionen zu erstellen.
So rufen Sie die UDTF mit allen Daten in derselben Partition auf:
Zum Aufruf von UDTF mit den nach Spalte x partitionierten Daten:
Beispiel: Zeilensammlung mit einer regulären UDTF im Vergleich zur Verwendung einer UDTF mit einer vektorisierten end_partition-Methode¶
Zeilensammlung mit einer regulären UDTF:
Zeilensammlung mit einer UDTF mit einer vektorisierten end_partition-Methode:
Beispiel: Berechnen der zusammenfassenden Statistik für jede Spalte in der Partition¶
Das folgende Beispiel zeigt, wie die Berechnung der zusammenfassenden Statistik für jede Spalte in der Partition mit der Pandas-Methode describe() vorgenommen wird.
Erstellen Sie eine Tabelle und erzeugen Sie drei Partitionen mit je fünf Zeilen:
Sehen Sie sich die Daten an:
Erstellen Sie die Funktion:
Führen Sie einen der folgenden Schritte aus:
Rufen Sie die Funktion auf, und führen Sie die Partitionierung über
idaus:Rufen Sie die Funktion auf und behandeln Sie die gesamte Tabelle als eine Partition:
Erstellen Sie eine UDTF mit einer vektorisierten Prozessmethode¶
Definieren Sie eine Handler-Klasse, ähnlich wie bei regulären UDTFs, und verwenden Sie die optionalen Methoden
__init__undend_partition.Definieren Sie eine
process-Methode, die ein DataFrame-Argument entgegennimmt und entweder einenpandas.DataFrameoder ein Tupel vonpandas.Seriesoderpandas.arrayszurückgibt, wobei jedes Array eine Spalte ist.Die Spaltentypen des Ergebnisses müssen mit den Spaltentypen der UDTF-Definition übereinstimmen. Das zurückgegebene Ergebnis muss genau ein DataFrame oder Tupel sein. Dies unterscheidet sich von einer vektorisierten
end_partition-Methode, bei der Sie eine Liste übergeben oder zurückgeben können.Um die
process-Methode als vektorisiert zu kennzeichnen, verwenden Sie das@vectorized-Decorator-Element oder das_sf_vectorized_input-Funktionsattribut.Weitere Informationen finden Sie unter Vektorisierte Python-UDFs. Das Decorator-Element
@vectorizedkann nur verwendet werden, wenn die Python-UDTF innerhalb von Snowflake ausgeführt wird, z. B. bei Verwendung eines SQL-Arbeitsblatts. Wenn Sie zum Ausführen den Client oder ein Python-Arbeitsblatt verwenden, müssen Sie das Funktionsattribut verwenden.Optional: Wenn Ihre Python-Handler-Funktion das Zeitlimit für die Ausführung überschreitet, können Sie unter eine Zielbatchgröße einstellen.
Bemerkung
Die Standard-Spaltennamen für den Eingabe-DataFrame einer UDTF mit vektorisierter process-Methode entsprechen der Signatur der SQL-Funktion. Die Spaltennamen entsprechen den Anforderungen für SQL-Bezeichner. Wenn nämlich ein Bezeichner nicht in Anführungszeichen steht, wird er groß geschrieben, und wenn er in doppelten Anführungszeichen steht, bleibt er unverändert.
Der Handler für eine UDTF mit einer vektorisierten process-Methode kann so implementiert werden, dass er Batches auf eine partitionierte Art und Weise verarbeitet oder sie einfach Batch für Batch verarbeitet. Weitere Informationen dazu finden Sie unter Zustandsabhängige und zustandslose Verarbeitung.
Beispiel: Verwenden einer UDTF mit einer vektorisierten Prozessmethode, um eine Hot-Codierung anzuwenden¶
Verwenden Sie eine UDTF mit einer vektorisierten process-Methode, um eine Hot-Codierung auf eine Tabelle mit zehn Kategorien anzuwenden:
Beispielergebnis:
Bereiten Sie das Drucken der Tabelle vor:
Beispielergebnis:
Sie können das gleiche Ergebnis mit einem vektorisierten UDF erzielen, auch wenn dies weniger bequem ist. Sie müssen die Ergebnisse in eine einzige Spalte packen und dann die Spalte entpacken, um die Ergebnisse in einem brauchbaren pandas-DataFrame wiederherzustellen.
Beispiel für die Verwendung eines vektorisierten UDF:
Typunterstützung¶
Vektorisierte UDTFs unterstützen die gleichen SQL-Typen wie vektorisierte UDFs. Bei vektorisierten UDTFs werden SQL-NUMBER-Argumente mit einer Dezimalstellenzahl von 0, die alle in einen 64-Bit-Ganzzahl-Typ oder kleiner passen, immer Int16, Int32 oder Int64 zugeordnet. Anders als bei skalaren UDFs wird das Argument einer skalaren UDTF, das nicht nullwertfähig ist, nicht in int16, int32 oder int64 umgewandelt.
Eine umfassende Übersicht zur Zuordnung von SQL-Typen zu pandas-dtypes finden Sie in der Typunterstützungstabelle unter dem Thema zu vektorisierten Python-UDFs.
Best Practices¶
Wenn mit jeder Zeile ein skalarer Wert zurückgegeben werden muss, erstellen Sie eine Liste von sich wiederholenden Werten, anstatt das
numpy-Array zu entpacken, um Tupel zu erstellen. Zum Beispiel für ein zweispaltiges Ergebnis, anstatt:Verwenden Sie dies:
Um die Leistung zu verbessern, entpacken Sie semistrukturierte Daten in Spalten.
Wenn Sie z. B. eine Varianten-Spalte
objmit den Elementenx(int),y(float)undz(string)haben, können Sie stattdessen eine UDTF mit einer Signatur wie dieser definieren und sie mitvec_udtf(obj)aufrufen:Definieren Sie die UDTF mit einer Signatur wie dieser und rufen Sie sie mit
vec_udtf(obj:x, obj:y, obj:z)auf:Standardmäßig kodiert Snowflake die Eingaben in Pandas-dtypes, die NULL-Werte unterstützen (z. B. Int64). Wenn Sie eine Bibliothek verwenden, die einen primitiven Typ erfordert (z. B.
numpy), und Ihre Eingabe keine NULL-Werte enthält, sollten Sie die Spalte erst in einen primitiven Typ umwandeln, bevor Sie die Bibliothek verwenden. Beispiel:Weitere Informationen dazu finden Sie unter Typunterstützung.
Um bei Verwendung von UDTFs mit einer vektorisierten
end_partition-Methode die Leistung zu verbessern und Timeouts zu vermeiden, sollten Siepandas.concatnicht zum Akkumulieren von Teilergebnissen verwenden. Geben Sie stattdessen das Teilergebnis zurück, sobald es zur Verfügung steht.Verwenden Sie also nicht:
Sondern: