Ir al contenido principal

Entrega de datos rentables en tiempo real con dbt y Databricks

Delivering cost-effective data in real-time with dbt and Databricks

Publicado: 12 de diciembre de 2023

Soluciones8 min de lectura

A medida que las empresas crecen, los volúmenes de datos aumentan de GB a TB (o más), y las demandas de latencia pasan de horas a minutos (o menos), lo que hace cada vez más costoso proporcionar información actualizada al negocio. Históricamente, los ingenieros de datos de Python y Scala recurrían a la transmisión para satisfacer estas demandas, procesando eficientemente nuevos datos en tiempo real, pero los ingenieros de análisis que necesitaban escalar canalizaciones dbt basadas en SQL no tenían esta opción.

¡Ya no! Este blog busca ilustrar cómo podemos usar las nuevas Tablas de Transmisión y Vistas Materializadas en Databricks para ofrecer información fresca y en tiempo real a las empresas con la simplicidad de SQL y dbt.

Antecedentes

En la Data + AI Summit de 2023, presentamos Tablas de Transmisión y Vistas Materializadas en Databricks SQL. Esta increíble capacidad brindó a los usuarios de Databricks SQL un fácil acceso a nuevas y potentes materializaciones de tablas introducidas por primera vez en Delta Live Tables, lo que les permitió incrementalizar consultas grandes, transmitir directamente desde fuentes de datos de eventos y más.

Además de usar de forma nativa Tablas de Transmisión y Vistas Materializadas dentro de un entorno Databricks, también funcionan para usuarios de dbt en Databricks. dbt-databricks se ha convertido en una de las formas más populares de construir modelos de datos en Databricks, aprovechando todas las potentes capacidades de Databricks SQL, incluido el motor de cómputo Photon, la escalabilidad instantánea de los Almacenes SQL sin servidor y el modelo de gobernanza de Unity Catalog, con la ubicuidad del marco de transformación de dbt.

¿Qué ha cambiado en dbt-databricks?

A partir de dbt v1.6+, dbt-databricks ha evolucionado en tres facetas clave:

  1. Nuevas materializaciones: "streaming_table" y "materialized_view"
  2. Nueva sintaxis para leer directamente del almacenamiento de datos en la nube sin necesidad de preparar sus fuentes como una tabla
  3. Acceso a conceptos avanzados de transmisión, como agregaciones de ventanas, marcas de agua y uniones de transmisión a transmisión

Nota: ¡Esté atento al próximo lanzamiento de dbt v1.7.3 que refinará aún más las capacidades anteriores!

Veamos cómo podemos usar estas nuevas características con la demostración de Airline Trips.

La demostración de Airline Trips

La demostración de Airline Trips se creó para demostrar cómo ingerir y transformar incrementalmente datos de eventos en vivo para obtener información comercial actualizada en Databricks, ya sea un panel o un modelo de IA. El conjunto de datos representa todos los viajes aéreos que se realizan en los Estados Unidos a lo largo del tiempo, capturando los retrasos en las salidas y llegadas de cada viaje.

Un cuaderno auxiliar incluido establece una transmisión simulada de este conjunto de datos, mientras que el proyecto dbt muestra un modelo de datos que toma estos eventos json sin procesar y los transforma a través de ETL de transmisión en una capa de Vistas Materializadas, tablas de características y más.

El repositorio está disponible públicamente aquí, y utiliza datos de muestra empaquetados en todos los espacios de trabajo de Databricks de inmediato. ¡Siéntase libre de seguir!

El modelo de datos de viajes aéreos
El modelo de datos de viajes aéreos
GUÍA

Tu guía compacta para el análisis moderno

Ingesta de datos desde el almacenamiento de datos en la nube

Una de las formas más sencillas de empezar a utilizar Tablas de Transmisión es para la ingesta de datos desde el almacenamiento de datos en la nube, como S3 para AWS o ADLS para Azure. Es posible que tenga una fuente de datos ascendente que genere datos de eventos a gran volumen, y un proceso para depositarlos como archivos sin procesar en una ubicación de almacenamiento, típicamente json, csv, parquet o avro.

En nuestra demostración, imaginemos que recibimos un flujo en vivo de cada viaje aéreo realizado en los Estados Unidos de un tercero, y queremos ingerirlo incrementalmente a medida que llega.

En lugar de preparar los archivos como una tabla externa, o usar una herramienta de terceros para materializar una Tabla Delta para la fuente de datos, simplemente podemos usar Tablas de Transmisión para resolver esto. Tome el modelo a continuación para nuestra alimentación de viajes aéreos de bronce:

Los dos puntos clave a tener en cuenta son:

  • La estrategia de materialización se establece en 'streaming_table'
    • Esto ejecutará un comando CREATE OR REFRESH STREAMING TABLE en Databricks
  • La sintaxis para leer desde el almacenamiento en la nube aprovecha Auto Loader internamente
    • read_files() enumerará los nuevos archivos json en la carpeta especificada y comenzará a procesarlos. Dado que usamos dbt, hemos aprovechado la función var() en dbt para pasar dinámicamente una ruta de carpeta s3 (con el formato "s3://…")
    • La palabra clave STREAM indica que se debe transmitir desde esta ubicación. Alternativamente, sin ella, todavía podemos usar read_files() con materialized='table' para realizar una lectura por lotes directamente desde la carpeta especificada

Como aparte, aunque Auto Loader requiere la menor configuración, también puede transmitir directamente desde una plataforma de transmisión de eventos como Kafka, Kinesis o Event Hubs para una latencia aún menor utilizando una sintaxis muy similar. Consulte aquí para más detalles.

Enriquecimiento incremental de datos para la capa plateada

La transmisión no tiene por qué detenerse en el paso de ingesta. Si queremos realizar algunas uniones posteriores o agregar una clave sustituta, pero queremos limitarlo solo a los datos nuevos para ahorrar cómputo, podemos continuar usando la materialización de Tabla de Transmisión. Por ejemplo, tome el fragmento de nuestro próximo modelo para la capa plateada, la alimentación enriquecida de viajes aéreos, donde unimos tablas de mapeo para códigos de aeropuerto al conjunto de datos sin procesar:

Una vez más, hemos utilizado la materialización de Tabla de Transmisión y hemos podido aprovechar la funcionalidad estándar de dbt para toda nuestra lógica. Esto incluye:

  • Aprovechar el paquete dbt_utils para atajos útiles como generar una clave sustituta
  • Usar la declaración ref() para mantener un linaje completo

El único cambio real en nuestro SQL fue la adición de la palabra clave STREAM() alrededor de la declaración ref() para airline_trips_bronze, para indicar que esta tabla se está leyendo incrementalmente, mientras que la tabla airport_codes que se une es una tabla de mapeo que se lee en su totalidad. Esto se llama una unión de transmisión estática.

Elaboración de una capa dorada eficiente en cómputo con Vistas Materializadas

Con nuestras tablas plateadas enriquecidas listas, ahora podemos pensar en cómo queremos servir información agregada a nuestros consumidores comerciales finales. Típicamente, si usamos una materialización de tabla, tendríamos que recalcular todos los resultados históricos cada vez.

Para aprovechar las Tablas de Transmisión ascendentes que solo procesan nuevos datos en cada ejecución, recurrimos a las Vistas Materializadas para la tarea.

¡La buena noticia en Databricks es que un modelo que construye una Vista Materializada no se ve diferente a un modelo que construye una tabla! Tomemos nuestro ejemplo para una Vista Materializada de capa dorada para calcular el porcentaje de vuelos retrasados cada día:

¡Todo lo que cambiamos fue la configuración de materialización!

Recuerde, las Vistas Materializadas se pueden actualizar incrementalmente cuando hay cambios en las tablas base. En el escenario anterior, a medida que transmitimos nuevos datos, la Vista Materializada determina qué grupos requieren recálculo y solo calcula estos, dejando las agregaciones sin cambios tal como están y reduciendo los costos generales de cómputo. Esto es más fácil de visualizar en el ejemplo, ya que agregamos por ArrDate, la fecha de llegada de los vuelos, lo que significa que los nuevos días de datos caerán naturalmente en nuevos grupos y los grupos existentes permanecerán sin cambios.

Analizando los registros de eventos de la Vista Materializada (en la imagen a continuación) después de varias ejecuciones del modelo, podemos ver la incrementalización en acción. La primera ejecución es un cálculo completo como cualquier tabla, pero una segunda ejecución para actualizar las agregaciones con nuevos datos aprovecha una actualización incremental fila por fila. Una ejecución final del modelo reconoció que no se habían ingerido nuevos datos en la fuente y simplemente no hizo nada.

Registro de eventos de vistas materializadas
Registro de eventos de vistas materializadas

¿Qué más puedo esperar en el repositorio de demostración?

Hemos cubierto lo básico para obtener datos directamente de la fuente de eventos hasta una Vista Materializada lista para BI, pero el repositorio de demostración contiene mucho más.

En el repositorio se incluyen ejemplos de cómo monitorizar registros para Tablas de Streaming y Vistas Materializadas para entender cómo se están procesando los datos, así como un ejemplo avanzado no cubierto en este blog de cómo unir dos flujos juntos en una unión de flujos (stream-stream join) ¡solo con SQL!

Clona el repositorio en tu entorno de Databricks para empezar, o conecta dbt Cloud a Databricks sin costo adicional con partner connect. También puedes aprender más con la documentación para Vistas Materializadas y Tablas de Streaming.

(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.