Passa al contenuto principale

Introduzione alle User-Defined Table Functions (UDTF) Python in Unity Catalog

introducing uc python user defined table functions og

Summary

  • Le UDTF Python in Unity Catalog offrono un modo semplice ma potente per creare UDTF Python una volta e richiamarle da qualsiasi punto del tuo lakehouse (ad esempio, SQL warehouses, cluster Standard e Dedicated, compute Serverless e altro).
  • Scoprile e governale come qualsiasi altro asset di dati in Unity Catalog.

Le UDF Python consentono di creare un livello di astrazione di logica personalizzata per semplificare la costruzione delle query. Ma cosa succede se si desidera applicare una logica complessa, come l'esecuzione di un modello di grandi dimensioni o il rilevamento efficiente di pattern tra le righe della tabella?

In precedenza abbiamo introdotto le User-Defined Table Functions (UDTF) Python con ambito di sessione per supportare una logica di query personalizzata più potente. Le UDTF consentono di eseguire logica Python robusta e stateful su intere tabelle, rendendo semplice risolvere problemi normalmente difficili in puro SQL.

Perché le User-Defined Table Functions:

  • Elabora in modo flessibile qualsiasi set di dati

    La parola chiave dichiarativa TABLE() consente di inviare qualsiasi tabella, vista o anche una sottoquery dinamica direttamente alla tua UDTF. Questo trasforma la tua funzione in un blocco di costruzione potente e riutilizzabile per qualsiasi porzione dei tuoi dati. Puoi anche usare PARTITION BY, ORDER BY e WITH SINGLE PARTITION per partizionare la tabella di input in sottoinsiemi di righe da elaborare da chiamate di funzione indipendenti direttamente all'interno della tua funzione Python.

  • Esegui inizializzazioni pesanti solo una volta per partizione

    Con una UDTF, puoi eseguire codice di configurazione costoso, come il caricamento di un modello ML di grandi dimensioni o un file di riferimento di grandi dimensioni, solo una volta per ogni partizione di dati, non per ogni singola riga.

  • Mantieni il contesto tra le righe

    Le UDTF possono mantenere stati da una riga all'altra all'interno di una partizione. Questa capacità unica abilita analisi avanzate come il rilevamento di pattern di serie temporali e calcoli complessi in esecuzione.

Ancora meglio, quando le UDTF sono definite in Unity Catalog (UC), queste funzioni sono accessibili, individuabili ed eseguibili da chiunque disponga delle autorizzazioni appropriate. In breve, scrivi una volta e esegui ovunque.

Siamo entusiasti di annunciare che le UDTF Python di UC sono ora disponibili in anteprima pubblica con Databricks Runtime 17.3 LTS, Databricks SQL e notebook e job serverless.

In questo blog, discuteremo alcuni casi d'uso comuni delle UDTF Python di UC con esempi e spiegheremo come puoi utilizzarle nel tuo data pipeline.

Ma prima, perché le UDTF con UC?

Il vantaggio delle UDTF Python di Unity Catalog

  • Implementa una volta in puro Python e chiamala da qualsiasi luogo tra sessioni e workspace

    Scrivi la tua logica in una classe Python standard e chiama le UDTF Python da warehouse SQL (con Databricks SQL Pro e Serverless), cluster Standard e Dedicated UC e pipeline dichiarative Lakeflow.

  • Individua utilizzando tabelle di sistema o Catalog Explorer

  • Condividila tra gli utenti, con la piena governance di Unity Catalog
  • Concedi e revoca le autorizzazioni per le UDTF Python

  • Esecuzione sicura con isolamento LakeGuard: le UDTF Python vengono eseguite in sandbox con accesso temporaneo a disco e rete, impedendo la possibilità di interferenze da altri workload.

Quick Start: Corrispondenza semplificata degli indirizzi IP

Iniziamo con un problema comune di data engineering: la corrispondenza degli indirizzi IP con un elenco di blocchi CIDR di rete (ad esempio, per identificare il traffico dalle reti interne). Questo compito è scomodo in SQL standard, poiché manca di funzioni integrate per la logica e i pacchetti CIDR.

Le UDTF Python di UC rimuovono questo attrito. Consentono di portare le ricche librerie e gli algoritmi di Python direttamente nel tuo SQL. Costruiremo una funzione che:

  1. Accetta una tabella di log IP come input.
  2. Carica in modo efficiente un elenco di CIDR di rete noti una sola volta per partizione di dati.
  3. Per ogni indirizzo IP, utilizza la potente libreria ipaddress di Python per verificare se appartiene a una delle reti note.
  4. Restituisce i dati di log originali, arricchiti con la rete corrispondente.

Iniziamo con alcuni dati di esempio contenenti indirizzi IPv4 e IPv6.

Successivamente, definiremo e registreremo la nostra UDTF. Nota la struttura della classe Python:

  • Il parametro t TABLE accetta una tabella di input con qualsiasi schema: l'UDTF si adatta automaticamente per elaborare le colonne fornite. Questa flessibilità significa che puoi usare la stessa funzione su tabelle diverse senza dover modificare la firma della funzione, ma richiede anche un controllo attento dello schema delle righe.
  • Il metodo __init__ è perfetto per configurazioni pesanti e una tantum, come il caricamento del nostro ampio elenco di reti. Questo lavoro viene eseguito una volta per partizione della tabella di input.
  • Il metodo eval elabora ogni riga, contenendo la logica di corrispondenza principale. Questo metodo viene eseguito esattamente una volta per ogni riga della partizione di input consumata dalla sua istanza corrispondente della classe UDTF IpMatcher per quella partizione.
  • La clausola HANDLER specifica il nome della classe Python che implementa la logica UDTF.

Ora che la nostra ip_cidr_matcher è registrata in Unity Catalog, possiamo chiamarla direttamente da SQL utilizzando la sintassi TABLE(). È semplice come interrogare una tabella normale.

Produce:

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
eBook

Una guida pratica alle app su Databricks

Generazione di didascalie di immagini con inferenza batch

Questo esempio illustra la configurazione e l'utilizzo di una UDTF Python di UC per la didascalia di immagini in batch utilizzando gli endpoint di serving dei modelli di visione di Databricks. Per prima cosa, creiamo una tabella contenente URL di immagini pubblici da Wikimedia Commons:

Questa tabella contiene 4 immagini di esempio: una passerella naturalistica, una macrofotografia di una formica, un gatto e una galassia.

E quindi creiamo una UDTF Python di UC per generare didascalie per le immagini.

  1. Inizializziamo prima la UDTF con la configurazione, inclusi la dimensione del batch, il token API di Databricks, l'endpoint del modello di visione e l'URL dell'area di lavoro.
  2. Nel metodo eval, raccogliamo gli URL delle immagini in un buffer. Quando il buffer raggiunge la dimensione del batch, attiviamo l'elaborazione batch. Ciò garantisce che più immagini vengano elaborate insieme in una singola chiamata API anziché chiamate individuali per immagine.
  3. Nel metodo di elaborazione batch, scarichiamo tutte le immagini bufferizzate, le codifichiamo in base64 e le inviamo a una singola richiesta API a Databricks VisionModel. Il modello elabora tutte le immagini contemporaneamente e restituisce didascalie per l'intero batch.
  4. Il metodo terminate viene eseguito esattamente una volta alla fine di ogni partizione. Nel metodo terminate, elaboriamo eventuali immagini rimanenti nel buffer e produciamo tutte le didascalie raccolte come risultati.

Nota: sostituisci <workspace-url> con l'URL effettivo della tua area di lavoro Databricks (ad esempio, https://your-workspace.cloud.databricks.com).

Per utilizzare la UDTF batch per didascalie di immagini, chiamala semplicemente con la tabella di immagini di esempio: Nota: sostituisci your_secret_scope e api_token con l'effettivo scope del segreto e il nome della chiave per il token API di Databricks

L'output è:

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.

Puoi anche generare didascalie di immagini categoria per categoria:

L'output è:

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

Lavori futuri

Stiamo lavorando attivamente per estendere le UDTF Python con funzionalità ancora più potenti e performanti, tra cui:

  • UDTF polimorfiche in Unity Catalog sono funzioni i cui schemi di output vengono analizzati e risolti dinamicamente in base agli argomenti di input. Sono già supportate nelle UDTF Python con ambito di sessione e sono in fase di sviluppo per le UDTF Python in Unity Catalog.
  • UDTF Python Arrow: una nuova API UDTF Python che abilita l'elaborazione dei dati con batch di record Apache Arrow nativi (iterator[Arrow.record_batch]) per significativi miglioramenti delle prestazioni con grandi set di dati.

(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale

Non perdere mai un post di Databricks

Iscriviti al nostro blog e ricevi gli ultimi post direttamente nella tua casella di posta elettronica.