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.
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 ?
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
Accorder et révoquer les autorisations pour les UDTF Python
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 :
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 :
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_id | ip_address | network | ip_version |
|---|---|---|---|
| log1 | 192.168.1.100 | 192.168.0.0/16 | 4 |
| log2 | 10.0.0.5 | 10.0.0.0/8 | 4 |
| log3 | 172.16.0.10 | 172.16.0.0/12 | 4 |
| log4 | 8.8.8.8 | null | 4 |
| log5 | 2001:db8::1 | 2001:db8::/32 | 6 |
| log6 | 2001:db8:85a3::8a2e:370:7334 | 2001:db8::/32 | 6 |
| log7 | fe80::1 | fe80::/10 | 6 |
| log8 | ::1 | ::1/128 | 6 |
| log9 | 2001:db8:1234:5678::1 | 2001:db8::/32 | 6 |
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.
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 |
Nous travaillons activement à l'extension des UDTF Python avec des fonctionnalités encore plus puissantes et performantes, notamment :
(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original
