Revenir au contenu principal

Introduction aux fonctions définies par l'utilisateur (UDTF) Python dans Unity Catalog

introducing uc python user defined table functions og

Summary

  • Les UDTF Python dans Unity Catalog offrent un moyen simple mais puissant de créer des UDTF une fois et de les appeler depuis n'importe où dans votre lakehouse (par exemple, les entrepôts SQL, les clusters Standard et Dédiés, le calcul Serverless, et plus encore).
  • Découvrez-les et gérez-les comme n'importe quels autres actifs de données dans Unity Catalog.

Les UDF Python vous permettent de créer une couche d'abstraction de logique personnalisée pour simplifier la construction des requêtes. Mais que faire si vous souhaitez appliquer une logique complexe, comme l'exécution d'un grand modèle ou la détection efficace de motifs sur plusieurs lignes de votre table ?

Nous avons précédemment introduit les fonctions définies par l'utilisateur de table Python (UDTF) à portée de session pour prendre en charge une logique de requête personnalisée plus puissante. Les UDTF vous permettent d'exécuter une logique Python robuste et avec état sur des tables entières, ce qui facilite la résolution de problèmes normalement difficiles en SQL pur.

Pourquoi les fonctions définies par l'utilisateur de table :

  • Traiter n'importe quel jeu de données avec flexibilité

    Le mot-clé déclaratif TABLE() vous permet de transmettre n'importe quelle table, vue ou même une sous-requête dynamique directement dans votre UDTF. Cela transforme votre fonction en un bloc de construction puissant et réutilisable pour n'importe quelle tranche de vos données. Vous pouvez même utiliser PARTITION BY, ORDER BY et WITH SINGLE PARTITION pour partitionner la table d'entrée en sous-ensembles de lignes à traiter par des appels de fonction indépendants directement dans votre fonction Python.

  • Exécuter une initialisation lourde une seule fois par partition

    Avec une UDTF, vous pouvez exécuter du code de configuration coûteux, comme le chargement d'un grand modèle ML ou d'un gros fichier de référence, une seule fois pour chaque partition de données, et non pour chaque ligne.

  • Maintenir le contexte entre les lignes

    Les UDTF peuvent maintenir des états d'une ligne à l'autre au sein d'une partition. Cette capacité unique permet des analyses avancées comme la détection de motifs de séries temporelles et des calculs cumulés complexes.

Mieux encore, lorsque les UDTF sont définies dans Unity Catalog (UC), ces fonctions sont accessibles, découvrables et exécutables par toute personne disposant des autorisations appropriées. En bref, vous écrivez une fois et exécutez partout.

Nous sommes ravis d'annoncer que les UDTF Python UC sont désormais disponibles en aperçu public avec Databricks Runtime 17.3 LTS, Databricks SQL, et les notebooks et tâches Serverless.

Dans ce blog, nous discuterons de certains cas d'utilisation courants des UDTF Python UC avec des exemples et expliquerons comment vous pouvez les utiliser dans votre pipeline de données.

Mais d'abord, pourquoi les UDTF avec UC ?

L'avantage des UDTF Python Unity Catalog

  • Implémenter une fois en Python pur et l'appeler de n'importe où entre les sessions et les espaces de travail

    Écrivez votre logique dans une classe Python standard et appelez les UDTF Python depuis les entrepôts SQL (avec Databricks SQL Pro et Serverless), les clusters Standard et Dédiés UC, et les pipelines déclaratifs Lakeflow.

  • Découvrir à l'aide des tables système ou de Catalog Explorer

  • Partager entre les utilisateurs, avec la gouvernance complète d'Unity Catalog
  • Accorder et révoquer les autorisations pour les UDTF Python

  • Exécution sécurisée avec l'isolation LakeGuard : Les UDTF Python sont exécutées dans des environnements isolés avec un accès temporaire au disque et au réseau, empêchant toute interférence d'autres charges de travail.

Démarrage rapide : Correspondance simplifiée d'adresses IP

Commençons par un problème courant d'ingénierie de données : faire correspondre des adresses IP à une liste de blocs CIDR réseau (par exemple, pour identifier le trafic provenant de réseaux internes). Cette tâche est difficile en SQL standard, car il manque des fonctions intégrées pour la logique et les paquets CIDR.

Les UDTF Python UC éliminent cette friction. Elles vous permettent d'intégrer directement les riches bibliothèques et algorithmes de Python dans votre SQL. Nous allons créer une fonction qui :

  1. Prend une table de journaux IP en entrée.
  2. Charge efficacement une liste de CIDR réseau connus une seule fois par partition de données.
  3. Pour chaque adresse IP, elle utilise la puissante bibliothèque ipaddress de Python pour vérifier si elle appartient à l'un des réseaux connus.
  4. Retourne les données du journal d'origine, enrichies du réseau correspondant.

Commençons avec des données d'exemple contenant des adresses IPv4 et IPv6.

Ensuite, nous allons définir et enregistrer notre UDTF. Remarquez la structure de la classe Python :

  • Le paramètre t TABLE accepte une table d'entrée avec n'importe quel schéma — l'UDTF s'adapte automatiquement pour traiter les colonnes fournies. Cette flexibilité signifie que vous pouvez utiliser la même fonction sur différentes tables sans avoir à modifier la signature de la fonction, mais elle nécessite également une vérification minutieuse du schéma des lignes.
  • La méthode __init__ est parfaite pour une configuration lourde et unique, comme le chargement de notre grande liste de réseaux. Ce travail a lieu une fois par partition de la table d'entrée.
  • La méthode eval traite chaque ligne, contenant la logique de correspondance principale. Cette méthode s'exécute exactement une fois pour chaque ligne de la partition d'entrée consommée par son instance correspondante de la classe UDTF IpMatcher pour cette partition.
  • La clause HANDLER spécifie le nom de la classe Python qui implémente la logique UDTF.

Maintenant que notre ip_cidr_matcher est enregistré dans Unity Catalog, nous pouvons l'appeler directement depuis SQL en utilisant la syntaxe TABLE(). C'est aussi simple que d'interroger une table ordinaire.

Cela produit :

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

Guide pratique des applications sur Databricks

Génération de légendes d'images avec inférence par lots

Cet exemple détaille la configuration et l'utilisation d'une UDTF Python UC pour la génération de légendes d'images par lots à l'aide des points de terminaison de service de modèles de vision de Databricks. Tout d'abord, nous créons une table contenant des URL d'images publiques de Wikimedia Commons :

Cette table contient 4 images d'exemple : une passerelle naturelle, une photo macro de fourmi, un chat et une galaxie.

Et ensuite, nous créons une UDTF Python UC pour générer des légendes d'images.

  1. Nous initialisons d'abord l'UDTF avec la configuration, y compris la taille du lot, le jeton d'API Databricks, le point de terminaison du modèle de vision et l'URL de l'espace de travail.
  2. Dans la méthode eval, nous collectons les URL d'images dans un tampon. Lorsque le tampon atteint la taille du lot, nous déclenchons le traitement par lots. Cela garantit que plusieurs images sont traitées ensemble en un seul appel d'API plutôt que des appels individuels par image.
  3. Dans la méthode de traitement par lots, nous téléchargeons toutes les images mises en tampon, les encodons en base64 et les envoyons à une seule requête d'API vers Databricks VisionModel. Le modèle traite toutes les images simultanément et renvoie des légendes pour tout le lot.
  4. La méthode terminate est exécutée une seule fois à la fin de chaque partition. Dans la méthode terminate, nous traitons les images restantes dans le tampon et produisons toutes les légendes collectées comme résultats.

Veuillez noter de remplacer <workspace-url> par l'URL réelle de votre espace de travail Databricks (par exemple, https://your-workspace.cloud.databricks.com).

Pour utiliser l'UDTF de légende d'image par lots, il suffit de l'appeler avec la table d'images d'exemple : Veuillez noter de remplacer your_secret_scope et api_token par le scope secret et le nom de clé réels pour le jeton d'API Databricks

Le résultat est :

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.

Vous pouvez également générer des légendes d'images catégorie par catégorie :

Le résultat est :

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

Travaux futurs

Nous travaillons activement à l'extension des UDTF Python avec des fonctionnalités encore plus puissantes et performantes, notamment :

  • UDTF polymorphiques dans Unity Catalog sont des fonctions dont les schémas de sortie sont analysés et résolus dynamiquement en fonction des arguments d'entrée. Elles sont déjà prises en charge dans les UDTF Python à portée de session et sont en cours de développement pour les UDTF Python dans Unity Catalog.
  • UDTF Python Arrow : Une nouvelle API UDTF Python qui permet le traitement des données avec des lots d'enregistrements Apache Arrow natifs (iterator[Arrow.record_batch]) pour des gains de performance significatifs avec de grands ensembles de données.

(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original

Ne manquez jamais un article Databricks

Abonnez-vous à notre blog et recevez les derniers articles dans votre boîte mail.