curso
Introducción al paquete dbt-utils
El paquete dbt-utils es un potente conjunto de herramientas que simplifica y mejora tus procesos de transformación de datos. En esta guía, te presentaremos dbt-utils, mostrándote cómo puede agilizar tu flujo de trabajo con sus macros predefinidas para operaciones SQL comunes.
¿Qué es dbt-utils?
dbt-utils package
dbt-utils es un paquete de dbt que proporciona un conjunto de herramientas de macros preconstruidas que mejoran la funcionalidad de los proyectos dbt. dbt-utils reduce la complejidad añadiendo capas de abstracción, lo que permite una transformación de datos más eficaz y coherente.
Si estás familiarizado con las bibliotecas en Python y los paquetes en R, el paquete dbt-utils sería algo parecido.
Con estas macros estandarizadas que se utilizan para las operaciones comunes del Lenguaje de Consulta Estructurado (SQL), dbt-utils garantiza que no sea necesario el duro trabajo de codificar todas las transformaciones desde cero.
Aprovechar estas utilidades elimina la necesidad de reinventar la rueda al integrar en tus proyectos un conjunto de macros validadas por la comunidad, mejorando la capacidad de mantenimiento y fomentando una cultura de mejores prácticas.
Principales características y funcionalidades
dbt-utils proporciona una serie de características y funcionalidades que hacen que la transformación de datos sea más eficiente y ágil. Entre ellas están:
1. Macros normalizadas
dbt-utils ofrece una amplia gama de macros preconstruidas para operaciones SQL comunes que utilizan plantillas Jinja, como uniones, agregaciones, filtrado, etc.
Estas macros están estandarizadas para garantizar la coherencia entre proyectos y reducir la necesidad de codificación repetitiva.
Por ejemplo, aquí tienes algunas macros utilizadas por los ingenieros analíticos:
date_spine
: Crea una secuencia continua de fechas entre dos fechas especificadas, útil para el análisis de series temporales.pivot
: Transforma filas en columnas dinámicamente, simplificando las operaciones de tabulación cruzada.star
: Obtiene todos los campos de las tablas especificadas en el modelo, excluyendo los del argumentoexcept
.union_relations
: Combina datos de varias relaciones con la misma estructura utilizando ununion all
.generate_series
: Crea una serie de datos numéricos, útil para el análisis de series temporales.surrogate_key
: Produce un identificador único para las filas concatenando varios campos.
Con estas macros, SQL puede realizar tareas que de otro modo serían complejas y repetitivas.
2. Asistencia en esquemas y documentación
dbt-utils proporciona herramientas útiles para gestionar los esquemas y la documentación de los modelos de datos. Esto facilita el seguimiento de los cambios y la organización de los proyectos.
4. Capacidad de ensayo
Con dbt-utils, los usuarios pueden escribir fácilmente pruebas para garantizar la precisión y calidad de sus transformaciones de datos. Estas pruebas pueden automatizarse e integrarse en procesos de integración continua, lo que permite canalizar los datos de forma más eficaz y fiable.
¿Por qué utilizar dbt-utils?
Entonces, ¿por qué utilizar este paquete?
Veamos primero algunas de sus ventajas:
- SQL complejo simplificado: Con el uso de macros, dbt-utils simplifica la escritura de consultas SQL complejas. Esto ahorra tiempo y esfuerzo a los analistas de datos y a los ingenieros, permitiéndoles centrarse en análisis de alto nivel en lugar de enfrascarse en el código.
- Documentación eficiente: Como ya hemos dicho, dbt-utils puede ayudar a generar documentación automáticamente.
- Mayor control de calidad: Al incorporar funciones de comprobación a las canalizaciones de datos, dbt-utils ayuda a garantizar la precisión y fiabilidad de las transformaciones de datos.
- Validación automatizada de datos: Con el uso de dbt-utils, la validación de datos puede automatizarse e integrarse en el proceso de desarrollo. Esto garantiza que cualquier cambio realizado en los modelos de datos se valide inmediatamente y que cualquier problema potencial se detecte a tiempo.
- Código abierto: dbt-utils es de código abierto, por lo que muchos desarrolladores pueden contribuir al desarrollo del paquete. Esto significa que el paquete se actualizará constantemente.
Instalación y configuración de dbt-utils
Veamos a continuación cómo introducir el paquete dbt-utils en tu flujo de trabajo de datos.
Requisitos previos
Antes de utilizar dbt-utils, es imprescindible estar familiarizado con SQL y comprender los fundamentos de dbt (herramienta de construcción de datos). Ya deberías tener un proyecto dbt inicializado y configurado.
Si necesitas un repaso, puedes consultar nuestro curso de Introducción al dbt y el tutorial de dbt.
Además, es necesaria una clara alineación de versiones entre tu núcleo dbt y el paquete dbt-utils. Es aconsejable comprobar la compatibilidad entre versiones de dbt para evitar conflictos o funcionalidades obsoletas.
Instalación paso a paso
Para comenzar la integración de dbt-utils en tu pila de datos, empieza por asegurarte de que tu entorno de desarrollo está correctamente configurado.
Paso 1: Instalar dbt
En primer lugar, asegúrate de que dbt está instalado en tu entorno. Puedes instalar dbt mediante pip:
pip install dbt
Paso 2: Añade dbt-utils a tu proyecto dbt
Para instalar dbt-utils, añade lo siguiente a tu archivo packages.yml en el directorio raíz de tu proyecto dbt.
Crea este archivo en la raíz de tu proyecto dbt si no existe, y añade lo siguiente:
packages:
- package: dbt-labs/dbt_utils
version: "1.1.1" # Use the latest version compatible with your dbt version
En este archivo yaml, también especificarás la versión necesaria del paquete. Asegúrate de utilizar la última versión compatible con la versión de dbt que tengas instalada.
Paso 3: Instala el paquete
Después de modificarlo, la instalación está a un simple comando de distancia.
La ejecución correcta de este comando recuperará e instalará dbt-utils, preparándote para una funcionalidad mejorada.
Ejecuta el siguiente comando en tu terminal dentro del directorio de tu proyecto dbt:
dbt deps
Este comando instala todos los paquetes que figuran en tu packages.yml.
dbt-utils Utilidades clave y sus aplicaciones
El paquete dbt-utils proporciona un conjunto de funciones de ayuda comunes que agilizan las transformaciones SQL en los proyectos dbt.
Estas funciones ayudan a los desarrolladores a evitar redundancias y a concentrarse en su lógica empresarial exclusiva.
Aquí tienes algunas funciones de dbt-utils:
1. Generadores SQL
Los generadores SQL de dbt-utils son útiles para crear código SQL modular.
Por ejemplo, las macros deduplicate
son excelentes para eliminar filas duplicadas manteniendo el orden de los datos. Se pueden eliminar duplicados de modelos, tablas e incluso de Expresiones Comunes de Tabla (CTE).
2. Pruebas genéricas
Las pruebas genéricas se utilizan para validar los datos de una tabla o vista. Pueden personalizarse fácilmente para ajustarse a requisitos específicos y proporcionan información valiosa sobre la calidad de los datos que se procesan.
Por ejemplo, la macro expression_is_true
comprueba si una determinada expresión es verdadera. Esto se puede utilizar de forma flexible para verificar varias condiciones, como:
- Longitud de columna
- Resultado de una operación algebraica básica concreta
3. Ayudantes Jinja
Los ayudantes de Jinja son útiles para crear consultas SQL dinámicas que pueden personalizarse fácilmente en función de la entrada del usuario o de datos variables. Permiten la lógica condicional y los bucles dentro de las sentencias SQL.
Las plantillas Jinja se utilizan para definir y especificar estas macros.
Un ejemplo es la macro pretty_time
, que devuelve una cadena con la hora actual.
4. Macros web
Las macros web son similares a los ayudantes Jinja, pero están diseñadas específicamente para proyectos basados en la web. Permiten generar y manipular HTML de forma dinámica, facilitando la creación de páginas web interactivas y con capacidad de respuesta.
Una macro útil es la macro get_url_path
, que obtiene la ruta de la página de la URL. Así es como se ve la sintaxis:
{{ dbt_utils.get_url_path(field='page_url') }}
5. Macros introspectivos
Las macros introspectivas son macros que pueden acceder y manipular datos dentro del ámbito actual. Esto permite un tratamiento dinámico y eficaz de los datos, reduciendo la necesidad de funciones o código adicionales.
Un ejemplo es la macro get_column_values
, que devuelve los resultados de la consulta como un objeto.
Casos prácticos de uso de las utilidades dbt
Caso práctico 1: Simplificar las consultas complejas
Ejemplo de situación: Una empresa tiene un gran conjunto de datos que contiene información de clientes, datos de transacciones y datos de productos. Necesitan crear un informe que muestre las ventas totales de cada categoría de productos en el último trimestre.
En lugar de escribir complejas consultas SQL para unir varias tablas y calcular las ventas de cada categoría, pueden utilizar las utilidades dbt para extraer fácilmente los datos relevantes y manipularlos dentro de sus macros o modelos.
Por ejemplo, pueden utilizar get_filtered_columns_in_relation
para filtrar sólo las columnas necesarias relacionadas con los datos de los productos y, a continuación, utilizar la macro de suma para calcular las ventas totales de cada categoría.
Esto simplifica el proceso y lo hace más eficaz, ahorrando tiempo y reduciendo errores.
Aplicación del código:
Para aplicar esta solución en una base de datos simulada, puedes seguir estos pasos:
Utiliza la macro get_filtered_columns_in_relation
para filtrar sólo las columnas necesarias de los datos del producto. Esta macro te ayudará a seleccionar eficazmente las columnas relevantes.
-- models/product_data_filtered.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
)
select * from product_data
A continuación, crea un modelo para unir los datos del producto, la transacción y el cliente. A continuación, utiliza la función suma para calcular las ventas totales de cada categoría de productos en el último trimestre.
-- models/total_sales_by_category.sql
with product_data as (
select
{{ dbt_utils.get_filtered_columns_in_relation(
relation=ref('products'),
include=['product_id', 'category']
) }}
from {{ ref('products') }}
),
transaction_data as (
select
product_id,
sale_amount,
transaction_date
from {{ ref('transactions') }}
where transaction_date >= date_trunc('quarter', current_date) - interval '1 quarter'
),
joined_data as (
select
p.category,
t.sale_amount
from product_data p
join transaction_data t
on p.product_id = t.product_id
)
select
category,
sum(sale_amount) as total_sales
from joined_data
group by category
Tras definir los modelos, ejecuta los modelos dbt para ejecutar las transformaciones y generar el informe.
dbt run
Aquí tienes una explicación del código anterior:
La macro get_filtered_columns_in_relation
ayuda a seleccionar sólo las columnas necesarias (product_id and category
) de la tabla de productos, simplificando el conjunto de datos.
A continuación, los datos filtrados de los productos se unen a los datos de las transacciones mediante SQL para obtener los importes de las ventas de cada producto. A continuación, calcula las ventas totales de cada categoría de productos en el último trimestre utilizando la función de suma agregada.
Caso práctico 2: Garantizar la calidad de los datos con pruebas genéricas
Ejemplo de situación:
En este caso práctico, seguiremos trabajando con el mismo conjunto de datos simulado del caso práctico 1. Sin embargo, en lugar de crear un informe, nuestro objetivo es garantizar la calidad de los datos ejecutando pruebas genéricas sobre ellos.
Aplicación del código:
A continuación encontrarás ejemplos de cómo aplicar estas pruebas a tu conjunto de datos:
1. Comprobación de la proporción de nulos
En esta prueba genérica, sólo afirmaremos los valores que se ajusten a la proporción no nula que especifiquemos. Para ello utilizaremos la prueba not_null_proportion
.
# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_null_proportion:
at_least: 0.95
En este ejemplo, incluimos un argumento opcional adicional at_least
para establecer que la proporción no nula tenga un máximo de 0,95.
2. Comprobación de campos vacíos
En este ejemplo, utilizaremos la prueba not_empty_string
para comprobar si hay cadenas vacías en el campo product_id
.
# models/products.yml
version: 2
models:
- name: products
columns:
- name: product_id
tests:
- dbt_utils.not_empty_string
3. Comprobación de la integridad referencial
Utilizando la función relationships_where
te asegurarás de que cada product_id
de la tabla de transacciones existe en la tabla de productos.
# models/transactions.yml
version: 2
models:
- name: transactions
columns:
- name: product_id
tests:
- dbt_utils.relationships_where:
to: ref('products')
field: product_id
En este ejemplo, nos aseguramos de que todos los valores product_id
de la tabla transactions
corresponden a entradas válidas de la tabla tabla. Se trata de una comprobación básica de la integridad de la relación.
Ten en cuenta que también puedes combinar varias pruebas al mismo tiempo para poder cubrir varias comprobaciones de integridad.
Una vez definidas todas las pruebas en tu archivo de configuración yaml, utiliza el comando dbt test para ejecutar todas las pruebas de esquema definidas.
dbt test
dbt utils Buenas prácticas
Aprovechar dbt-utils eficazmente
Al utilizar dbt, es importante seguir las mejores prácticas para garantizar que tu proyecto se desarrolle de forma eficiente y eficaz. Cuando utilices dbt-utils, debes tener en cuenta algunos puntos clave:
- Combina varias pruebas en lugar de definirlas por separado: Como ya hemos dicho, puedes combinar varias pruebas en una sola declaración de prueba. Esto ayuda a reducir la redundancia y a mejorar el rendimiento general de tu proyecto.
- Utiliza la macro dbt_utils.surrogate_key al crear claves sustitutivas: Esta macro genera automáticamente claves sustitutivas basadas en otras columnas de tu tabla, ahorrándote tiempo y esfuerzo.
Errores comunes y cómo evitarlos
A continuación se indican algunos errores comunes que los usuarios pueden encontrar al utilizar dbt-utils, junto con consejos para evitarlos:
- No configurar correctamente las macros personalizadas: Si creas tus propias macros personalizadas, asegúrate de que están correctamente configuradas y probadas antes de incorporarlas a tu proyecto.
- No actualizar a la última versión de dbt-utils: Es importante actualizar regularmente a la última versión de dbt-utils para aprovechar las nuevas funciones y las correcciones de errores.
Conclusión
dbt-utils es una potente herramienta para agilizar, probar y automatizar tareas en tu proceso de modelado de datos. Es una parte esencial del uso de dbt y puede ahorrarte tiempo y esfuerzo en el desarrollo de tus modelos de datos.
También puede resultarte útil este tutorial sobre dbt o esta lista de herramientas alternativas de ingeniería de datos.
Si estás interesado en iniciarte en el dbt y quieres seguir aprendiendo, ¡explora también nuestro Curso de Introducción al dbt!
¡Continúa hoy tu viaje de aprendizaje dbt!
programa
Ingeniero de datos
programa
Ingeniero de Datos Asociado
tutorial
Tutorial de Chroma DB: guía paso a paso
tutorial
Paquetes R: Tutorial para principiantes
DataCamp Team
23 min
tutorial
Tutorial de DAX en Power BI para principiantes
DataCamp Team
9 min
tutorial
Tutorial de tuberías en R para principiantes
tutorial
Introducción al aprendizaje automático estadístico
Joanne Xiong
11 min
tutorial