Direkt zum Hauptinhalt

Einführung von Python User-Defined Table Functions (UDTFs) in Unity Catalog

introducing uc python user defined table functions og

Summary

  • Python UDTFs in Unity Catalog bieten eine einfache und dennoch leistungsstarke Möglichkeit, Python UDTFs einmal zu erstellen und sie von überall in Ihrem Lakehouse aufzurufen (z. B. SQL Warehouses, Standard- und dedizierte Cluster, Serverless Compute und mehr).
  • Entdecken und verwalten Sie sie wie alle anderen Datenassets in Unity Catalog.

Python UDFs ermöglichen es Ihnen, eine Abstraktionsschicht benutzerdefinierter Logik zu erstellen, um die Abfrageerstellung zu vereinfachen. Aber was ist, wenn Sie komplexe Logik anwenden möchten, wie z. B. das Ausführen eines großen Modells oder das effiziente Erkennen von Mustern über Zeilen in Ihrer Tabelle hinweg?

Wir haben zuvor sitzungsbezogene Python User-Defined Table Functions (UDTFs) eingeführt, um leistungsfähigere benutzerdefinierte Abfrage-Logik zu unterstützen. UDTFs ermöglichen es Ihnen, robuste, zustandsbehaftete Python-Logik über ganze Tabellen auszuführen, wodurch es einfach wird, normalerweise schwierige Probleme in reinem SQL zu lösen.

Warum User-Defined Table Functions:

  • Jeden Datensatz flexibel verarbeiten

    Das deklarative Schlüsselwort TABLE() ermöglicht es Ihnen, jede Tabelle, Ansicht oder sogar eine dynamische Unterabfrage direkt in Ihre UDTF zu leiten. Dies macht Ihre Funktion zu einem leistungsstarken, wiederverwendbaren Baustein für jeden Teil Ihrer Daten. Sie können sogar PARTITION BY, ORDER BY und WITH SINGLE PARTITION verwenden, um die Eingabetabelle in Teilmengen von Zeilen zu partitionieren, die von unabhängigen Funktionsaufrufen direkt innerhalb Ihrer Python-Funktion verarbeitet werden.

  • Schwere Initialisierung nur einmal pro Partition ausführen

    Mit einer UDTF können Sie teuren Setup-Code, wie das Laden eines großen ML-Modells oder einer großen Referenzdatei, nur einmal für jede Datenpartition ausführen, nicht für jede einzelne Zeile.

  • Kontext über Zeilen hinweg beibehalten

    UDTFs können Zustände von einer Zeile zur nächsten innerhalb einer Partition beibehalten. Diese einzigartige Fähigkeit ermöglicht fortgeschrittene Analysen wie die Erkennung von Zeitreihenmustern und komplexe laufende Berechnungen.

Noch besser: Wenn UDTFs in Unity Catalog (UC) definiert sind, sind diese Funktionen für jeden mit entsprechendem Zugriff zugänglich, auffindbar und ausführbar. Kurz gesagt, Sie schreiben einmal und führen überall aus.

Wir freuen uns, Ihnen mitteilen zu können, dass UC Python UDTFs jetzt in Public Preview mit Databricks Runtime 17.3 LTS, Databricks SQL und Serverless Notebooks und Jobs verfügbar sind.

In diesem Blogbeitrag werden wir einige gängige Anwendungsfälle von UC Python UDTFs mit Beispielen diskutieren und erklären, wie Sie sie in Ihrer Datenpipeline verwenden können.

Aber zuerst: Warum UDTFs mit UC?

Der Unity Catalog Python UDTF-Vorteil

  • Einmal in reinem Python implementieren und von überall über Sitzungen und Arbeitsbereiche aufrufen

    Schreiben Sie Ihre Logik in einer Standard-Python-Klasse und rufen Sie Python UDTFs von SQL-Warehouses (mit Databricks SQL Pro und Serverless), Standard- und dedizierten UC-Clustern sowie Lakeflow Declarative Pipelines auf.

  • Entdecken Sie sie über Systemtabellen oder den Catalog Explorer

  • Teilen Sie sie unter Benutzern, mit voller Unity Catalog-Governance
  • Berechtigungen für Python UDTFs gewähren und entziehen

  • Sichere Ausführung mit LakeGuard-Isolation: Python UDTFs werden in Sandboxes mit temporärem Festplatten- und Netzwerkzugriff ausgeführt, was die Möglichkeit von Störungen durch andere Workloads verhindert.

Schnellstart: Vereinfachte IP-Adressen-Abgleichung

Beginnen wir mit einem gängigen Problem im Data Engineering: dem Abgleich von IP-Adressen mit einer Liste von Netzwerk-CIDR-Blöcken (z. B. um den Datenverkehr aus internen Netzwerken zu identifizieren). Diese Aufgabe ist in Standard-SQL umständlich, da es keine integrierten Funktionen für CIDR-Logik und Pakete gibt.

UC Python UDTFs beseitigen diese Hürden. Sie bringen die reichhaltigen Bibliotheken und Algorithmen von Python direkt in Ihr SQL. Wir erstellen eine Funktion, die:

  1. Eine Tabelle mit IP-Protokollen als Eingabe nimmt.
  2. Eine Liste bekannter Netzwerk-CIDRs nur einmal pro Datenpartition effizient lädt.
  3. Für jede IP-Adresse die leistungsstarke ipaddress-Bibliothek von Python verwendet, um zu prüfen, ob sie zu einem der bekannten Netzwerke gehört.
  4. Die ursprünglichen Protokolldaten zurückgibt, angereichert mit dem übereinstimmenden Netzwerk.

Beginnen wir mit einigen Beispieldaten, die sowohl IPv4- als auch IPv6-Adressen enthalten.

Als Nächstes definieren und registrieren wir unsere UDTF. Beachten Sie die Python-Klassenstruktur:

  • Der t TABLE-Parameter akzeptiert eine Eingabetabelle mit beliebigem Schema – die UDTF passt sich automatisch an, um die bereitgestellten Spalten zu verarbeiten. Diese Flexibilität bedeutet, dass Sie dieselbe Funktion für verschiedene Tabellen verwenden können, ohne die Funktionssignatur ändern zu müssen, erfordert aber auch eine sorgfältige Überprüfung des Schemas der Zeilen.
  • Die Methode __init__ eignet sich perfekt für schwere, einmalige Setups, wie das Laden unserer großen Netzwerklسiste. Diese Arbeit wird einmal pro Partition der Eingabetabelle durchgeführt.
  • Die Methode eval verarbeitet jede Zeile und enthält die Kern-Abgleichlogik. Diese Methode wird genau einmal für jede Zeile der Eingabepartition ausgeführt, die von ihrer entsprechenden Instanz der IpMatcher UDTF-Klasse für diese Partition verarbeitet wird.
  • Die Klausel HANDLER gibt den Namen der Python-Klasse an, die die UDTF-Logik implementiert.

Jetzt, da unser ip_cidr_matcher in Unity Catalog registriert ist, können wir ihn direkt aus SQL mit der TABLE()-Syntax aufrufen. Es ist so einfach wie das Abfragen einer regulären Tabelle.

Es gibt aus:

log_idip_addressnetworkip_version
log1192.168.1.100192.168.0.0/164
log210.0.0.510.0.0.0/84
log3172.16.0.10172.16.0.0/124
log48.8.8.8null4
log52001:db8::12001:db8::/326
log62001:db8:85a3::8a2e:370:73342001:db8::/326
log7fe80::1fe80::/106
log8::1::1/1286
log92001:db8:1234:5678::12001:db8::/326
E-Book

Ein praktischer Leitfaden zu Apps auf Databricks

Generieren von Bildunterschriften mit Batch-Inferenz

Dieses Beispiel führt durch die Einrichtung und Verwendung einer UC Python UDTF für die Stapelverarbeitung von Bildunterschriften mit Databricks Vision Model Serving Endpunkten. Zuerst erstellen wir eine Tabelle mit öffentlichen Bild-URLs von Wikimedia Commons:

Diese Tabelle enthält 4 Beispielbilder: einen Natur-Boardwalk, ein Makrofoto einer Ameise, eine Katze und eine Galaxie.

Und dann erstellen wir eine UC Python UDTF, um Bildunterschriften zu generieren.

  1. Wir initialisieren zuerst die UDTF mit der Konfiguration, einschließlich Batch-Größe, Databricks API-Token, Vision-Modell-Endpunkt und Workspace-URL.
  2. In der eval-Methode sammeln wir die Bild-URLs in einem Puffer. Wenn der Puffer die Batch-Größe erreicht, lösen wir die Stapelverarbeitung aus. Dies stellt sicher, dass mehrere Bilder zusammen in einem einzigen API-Aufruf verarbeitet werden, anstatt einzelne Aufrufe pro Bild.
  3. In der Stapelverarbeitungsmethode laden wir alle gepufferten Bilder herunter, kodieren sie als Base64 und senden sie in einer einzigen API-Anfrage an das Databricks VisionModel. Das Modell verarbeitet alle Bilder gleichzeitig und gibt Unterschriften für den gesamten Stapel zurück.
  4. Die terminate-Methode wird genau einmal am Ende jeder Partition ausgeführt. In der terminate-Methode verarbeiten wir alle verbleibenden Bilder im Puffer und geben alle gesammelten Unterschriften als Ergebnisse aus.

Bitte beachten Sie, dass Sie <workspace-url> durch Ihre tatsächliche Databricks Workspace-URL ersetzen müssen (z. B. https://your-workspace.cloud.databricks.com).

Um die Batch-Image-Caption-UDTF zu verwenden, rufen Sie sie einfach mit der Beispieltabelle für Bilder auf: Bitte beachten Sie, dass Sie your_secret_scope und api_token durch den tatsächlichen Secret Scope und den Schlüsselnamen für das Databricks API-Token ersetzen müssen

Die Ausgabe ist:

caption
Wooden boardwalk cutting through vibrant wetland grasses under blue skies
Black ant in detailed macro photography standing on a textured surface
Tabby cat lounging comfortably on a white ledge against a white wall
Stunning spiral galaxy with bright central core and sweeping blue-white arms against the black void of space.

Sie können auch Bildunterschriften Kategorie für Kategorie generieren:

Die Ausgabe ist:

caption
Black ant in detailed macro photography standing on a textured surface
Stunning spiral galaxy with bright center and sweeping blue-tinged arms against the black of space.
Tabby cat lounging comfortably on white ledge against white wall
Wooden boardwalk cutting through lush wetland grasses under blue skies

Zukünftige Arbeit

Wir arbeiten aktiv daran, Python UDTFs um noch leistungsfähigere und performantere Funktionen zu erweitern, darunter:

  • Polymorphe UDTFs in Unity Catalog sind Funktionen, deren Ausgabeschemata dynamisch analysiert und basierend auf den Eingabeargumenten aufgelöst werden. Sie werden bereits in Session-Scope Python UDTFs unterstützt und sind für Python UDTFs in Unity Catalog in Arbeit.
  • Python Arrow UDTF: Eine neue Python UDTF-API, die die Datenverarbeitung mit nativem Apache Arrow Record Batch (iterator[Arrow.record_batch]) für signifikante Leistungssteigerungen bei großen Datensätzen ermöglicht.

(Dieser Blogbeitrag wurde mit KI-gestützten Tools übersetzt.) Originalbeitrag

Verpassen Sie keinen Beitrag von Databricks

Abonnieren Sie unseren Blog und erhalten Sie die neuesten Beiträge direkt in Ihren Posteingang.