Ir al contenido principal

Presentamos funciones definidas por el usuario de tabla (UDTF) de Python en Unity Catalog

introducing uc python user defined table functions og

Summary

  • Las UDTF de Python en Unity Catalog ofrecen una forma sencilla pero potente de crear UDTF de Python una vez y llamarlas desde cualquier lugar de tu lakehouse (por ejemplo, almacenes SQL, clústeres estándar y dedicados, cómputo serverless y más).
  • Descúbrelas y gobiérnalas como cualquier otro activo de datos en Unity Catalog.

Las UDF de Python te permiten crear una capa de abstracción de lógica personalizada para simplificar la construcción de consultas. Pero, ¿qué pasa si quieres aplicar lógica compleja, como ejecutar un modelo grande o detectar eficientemente patrones en filas de tu tabla?

Anteriormente, introdujimos las Funciones Definidas por el Usuario de Tabla (UDTF) de Python con ámbito de sesión para admitir una lógica de consulta personalizada más potente. Las UDTF te permiten ejecutar lógica de Python robusta y con estado en tablas completas, facilitando la resolución de problemas normalmente difíciles en SQL puro.

¿Por qué las Funciones Definidas por el Usuario de Tabla?:

  • Procesa Cualquier Conjunto de Datos de Forma Flexible

    La palabra clave declarativa TABLE() te permite canalizar cualquier tabla, vista o incluso una subconsulta dinámica directamente a tu UDTF. Esto convierte tu función en un bloque de construcción potente y reutilizable para cualquier porción de tus datos. Incluso puedes usar PARTITION BY, ORDER BY y WITH SINGLE PARTITION para particionar la tabla de entrada en subconjuntos de filas que serán procesados por llamadas de función independientes directamente dentro de tu función de Python.

  • Ejecuta Inicializaciones Pesadas Solo Una Vez Por Partición

    Con una UDTF, puedes ejecutar código de configuración costoso, como cargar un modelo de ML grande o un archivo de referencia grande, solo una vez por cada partición de datos, no por cada fila individual.

  • Mantiene el Contexto Entre Filas

    Las UDTF pueden mantener estados de una fila a la siguiente dentro de una partición. Esta capacidad única permite análisis avanzados como la detección de patrones de series temporales y cálculos acumulados complejos.

Mejor aún, cuando las UDTF se definen en Unity Catalog (UC), estas funciones son accesibles, descubribles y ejecutables por cualquier persona con el acceso adecuado. En resumen, escribes una vez y ejecutas en todas partes.

Nos complace anunciar que las UDTF de Python de UC ya están disponibles en Vista Previa Pública con Databricks Runtime 17.3 LTS, Databricks SQL y Cuadernos y Trabajos sin Servidor.

En este blog, discutiremos algunos casos de uso comunes de las UDTF de Python de UC con ejemplos y explicaremos cómo puedes usarlas en tu canalización de datos.

Pero primero, ¿por qué UDTF con UC?

La Ventaja de las UDTF de Python de Unity Catalog

  • Implementa una vez en Python puro y llámala desde cualquier lugar entre sesiones y espacios de trabajo

    Escribe tu lógica en una clase Python estándar y llama a las UDTF de Python desde almacenes SQL (con Databricks SQL Pro y Serverless), clústeres UC estándar y dedicados, y canalizaciones declarativas de Lakeflow.

  • Descubre usando tablas del sistema o Catalog Explorer

  • Compártela entre usuarios, con gobernanza completa de Unity Catalog
  • Otorga y revoca permisos para UDTF de Python

  • Ejecución segura con aislamiento de LakeGuard: Las UDTF de Python se ejecutan en entornos aislados con acceso temporal a disco y red, lo que evita la posibilidad de interferencia de otras cargas de trabajo.

Inicio Rápido: Coincidencia Simplificada de Direcciones IP

Comencemos con un problema común de ingeniería de datos: hacer coincidir direcciones IP con una lista de bloques CIDR de red (por ejemplo, para identificar tráfico de redes internas). Esta tarea es incómoda en SQL estándar, ya que carece de funciones integradas para lógica y paquetes CIDR.

Las UDTF de Python de UC eliminan esa fricción. Te permiten llevar las ricas bibliotecas y algoritmos de Python directamente a tu SQL. Crearemos una función que:

  1. Toma una tabla de registros IP como entrada.
  2. Carga eficientemente una lista de CIDR de red conocidos solo una vez por partición de datos.
  3. Para cada dirección IP, utiliza la potente biblioteca `ipaddress` de Python para verificar si pertenece a alguna de las redes conocidas.
  4. Devuelve los datos del registro original, enriquecidos con la red coincidente.

Comencemos con algunos datos de ejemplo que contienen direcciones IPv4 e IPv6.

A continuación, definiremos y registraremos nuestra UDTF. Observa la estructura de la clase Python:

  • El parámetro t TABLE acepta una tabla de entrada con cualquier esquema; la UDTF se adapta automáticamente para procesar las columnas que se proporcionen. Esta flexibilidad significa que puedes usar la misma función en diferentes tablas sin necesidad de modificar la firma de la función, pero también requiere una verificación cuidadosa del esquema de las filas.
  • El método __init__ es perfecto para configuraciones pesadas y únicas, como cargar nuestra lista de redes grande. Este trabajo se realiza una vez por partición de la tabla de entrada.
  • El método eval procesa cada fila, conteniendo la lógica de coincidencia principal. Este método se ejecuta exactamente una vez por cada fila de la partición de entrada que está siendo consumida por su instancia correspondiente de la clase UDTF IpMatcher para esa partición.
  • La cláusula HANDLER especifica el nombre de la clase Python que implementa la lógica UDTF.

Ahora que nuestro ip_cidr_matcher está registrado en Unity Catalog, podemos llamarlo directamente desde SQL usando la sintaxis TABLE(). Es tan simple como consultar una tabla normal.

Esto 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
LIBRO ELECTRÓNICO

Una guía práctica de aplicaciones en Databricks

Generación de subtítulos de imágenes con inferencia por lotes

Este ejemplo detalla la configuración y el uso de una UDTF de Python de UC para la generación de subtítulos de imágenes por lotes utilizando los puntos de conexión de servicio de modelos de visión de Databricks. Primero, creamos una tabla que contiene URL de imágenes públicas de Wikimedia Commons:

Esta tabla contiene 4 imágenes de ejemplo: un paseo marítimo en la naturaleza, una foto macro de una hormiga, un gato y una galaxia.

Y luego creamos una UDTF de Python de UC para generar subtítulos de imágenes.

  1. Primero inicializamos la UDTF con la configuración, incluyendo el tamaño del lote, el token de la API de Databricks, el punto final del modelo de visión y la URL del espacio de trabajo.
  2. En el método eval, recopilamos las URL de las imágenes en un búfer. Cuando el búfer alcanza el tamaño del lote, activamos el procesamiento por lotes. Esto asegura que varias imágenes se procesen juntas en una sola llamada a la API en lugar de llamadas individuales por imagen.
  3. En el método de procesamiento por lotes, descargamos todas las imágenes almacenadas en el búfer, las codificamos en base64 y las enviamos a una única solicitud de API a Databricks VisionModel. El modelo procesa todas las imágenes simultáneamente y devuelve subtítulos para todo el lote.
  4. El método terminate se ejecuta exactamente una vez al final de cada partición. En el método terminate, procesamos las imágenes restantes en el búfer y generamos todos los subtítulos recopilados como resultados.

Tenga en cuenta que debe reemplazar <workspace-url> con la URL real de su espacio de trabajo de Databricks (por ejemplo, https://your-workspace.cloud.databricks.com).

Para usar la UDTF de subtítulos de imágenes por lotes, simplemente llámela con la tabla de imágenes de ejemplo: Tenga en cuenta que debe reemplazar your_secret_scope y api_token con el ámbito secreto real y el nombre de la clave para el token de la API de Databricks

El resultado es:

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.

También puedes generar subtítulos de imágenes categoría por categoría:

El resultado es:

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

Trabajo futuro

Estamos trabajando activamente para extender las UDTF de Python con características aún más potentes y de alto rendimiento, que incluyen:

  • UDTF polimórficas en Unity Catalog son funciones cuyos esquemas de salida se analizan y resuelven dinámicamente según los argumentos de entrada. Ya son compatibles con las UDTF de Python con ámbito de sesión y están en progreso para las UDTF de Python en Unity Catalog.
  • UDTF de Python Arrow: Una nueva API de UDTF de Python que permite el procesamiento de datos con lotes de registros Apache Arrow nativos (iterator[Arrow.record_batch]) para importantes mejoras de rendimiento con grandes conjuntos de datos.

(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original

No te pierdas ninguna publicación de Databricks.

Suscríbete a nuestro blog y recibe las últimas publicaciones en tu bandeja de entrada.