Saltar al contenido
dbt: Data Build Tool

31 de mayo de 2026

dbt: Data Build Tool

Una visión general de dbt — la herramienta que lleva las mejores prácticas de ingeniería de software a las transformaciones de datos en tu warehouse.

Data Infrastructure
dbt SQL Ingeniería de Datos ELT

dbt (data build tool) transforma datos dentro de tu warehouse usando SQL. Trae prácticas de ingeniería de software (control de versiones, testing, documentación) a la analítica.

¿Qué Es dbt?

dbt se encarga de la T en ELT:

Extraer → Cargar → Transformar (dbt)
                        │
                Modelos SQL en tu warehouse
                (Snowflake, BigQuery, Redshift, Databricks)

Idea clave: Escribe sentencias SELECT. dbt se encarga del resto (DDL, dependencias, testing).

Cómo Funciona

┌─────────────────────────────────────────┐
│  Proyecto dbt (tu repositorio)          │
│  ├── models/          (archivos SQL)    │
│  ├── tests/           (tests de datos)  │
│  ├── macros/          (SQL reutilizable)│
│  ├── seeds/           (archivos CSV)    │
│  ├── snapshots/       (SCD Tipo 2)      │
│  └── dbt_project.yml  (configuración)   │
├─────────────────────────────────────────┤
│  dbt CLI / dbt Cloud                    │
│  dbt run → compila SQL → ejecuta        │
├─────────────────────────────────────────┤
│  Data Warehouse                         │
│  (crea tablas/vistas desde tu SQL)      │
└─────────────────────────────────────────┘

Modelos

Un modelo es una sentencia SQL SELECT guardada como archivo .sql. dbt la convierte en una tabla o vista en tu warehouse.

-- models/staging/stg_pedidos.sql
SELECT
    id AS pedido_id,
    user_id AS cliente_id,
    fecha_pedido,
    estado,
    importe
FROM {{ source('raw', 'pedidos') }}
WHERE estado != 'eliminado'

Tipos de Materialización

TipoQué CreaCuándo Usar
viewVista SQLTransformaciones ligeras, pocos datos
tableTabla físicaConsultas pesadas, muchos datos
incrementalAñadir/fusionar nuevas filasTablas grandes, cargas diarias
ephemeralCTE (no crea objeto)Lógica intermedia
-- models/marts/fct_pedidos.sql
{{ config(materialized='incremental') }}

SELECT
    pedido_id,
    cliente_id,
    fecha_pedido,
    importe
FROM {{ ref('stg_pedidos') }}

{% if is_incremental() %}
WHERE fecha_pedido > (SELECT MAX(fecha_pedido) FROM {{ this }})
{% endif %}

Estructura del Proyecto

proyecto_dbt/
├── models/
│   ├── staging/          ← limpiar datos crudos (1:1 con fuentes)
│   │   ├── stg_pedidos.sql
│   │   └── stg_clientes.sql
│   ├── intermediate/     ← lógica de negocio
│   │   └── int_items_pedido.sql
│   └── marts/            ← tablas finales para BI
│       ├── fct_pedidos.sql
│       └── dim_clientes.sql
├── tests/
├── macros/
├── seeds/
└── dbt_project.yml

DAG (Grafo de Dependencias)

dbt construye un DAG a partir de las llamadas {{ ref() }}:

source('raw', 'pedidos')
        │
  stg_pedidos ──→ int_items_pedido ──→ fct_pedidos
                                           │
  stg_clientes ──→ dim_clientes ──────────┘

dbt run ejecuta los modelos en el orden correcto.

Características Clave

Sources (Fuentes)

Definir de dónde vienen los datos crudos:

# models/staging/sources.yml
sources:
  - name: raw
    tables:
      - name: pedidos
        loaded_at_field: _loaded_at
        freshness:
          warn_after: {count: 12, period: hour}
          error_after: {count: 24, period: hour}

Tests

Tests de calidad de datos integrados y personalizados:

# models/staging/schema.yml
models:
  - name: stg_pedidos
    columns:
      - name: pedido_id
        tests:
          - unique
          - not_null
      - name: estado
        tests:
          - accepted_values:
              values: ['realizado', 'enviado', 'completado', 'devuelto']
      - name: cliente_id
        tests:
          - relationships:
              to: ref('stg_clientes')
              field: cliente_id

Macros

Snippets SQL reutilizables (Jinja):

-- macros/centimos_a_euros.sql
{% macro centimos_a_euros(nombre_columna) %}
    ({{ nombre_columna }} / 100)::decimal(10,2)
{% endmacro %}

-- Uso en un modelo:
SELECT
    pedido_id,
    {{ centimos_a_euros('importe_centimos') }} AS importe_euros
FROM {{ ref('stg_pedidos') }}

Seeds

Cargar archivos CSV pequeños en tu warehouse:

seeds/codigos_pais.csv → dbt seed → tabla codigos_pais

Snapshots

Rastrear cambios a lo largo del tiempo (SCD Tipo 2):

-- snapshots/snap_clientes.sql
{% snapshot snap_clientes %}
{{ config(
    target_schema='snapshots',
    strategy='timestamp',
    unique_key='cliente_id',
    updated_at='updated_at'
) }}
SELECT * FROM {{ source('raw', 'clientes') }}
{% endsnapshot %}

Comandos dbt

ComandoQué Hace
dbt runConstruir todos los modelos
dbt testEjecutar todos los tests
dbt buildRun + test (en orden)
dbt run --select nombre_modeloConstruir un modelo
dbt run --select nombre_modelo+Construir modelo + dependientes
dbt docs generateGenerar documentación
dbt source freshnessVerificar frescura de fuentes
dbt seedCargar archivos CSV seed
dbt snapshotEjecutar snapshots

dbt Core vs dbt Cloud

Característicadbt Core (Gratis)dbt Cloud (Pago)
CLISíSí
IDE WebNoSí
ProgramaciónExterna (Airflow, cron)Integrada
CI/CDConfigurar tú mismoIntegrado
DocumentaciónGenerar localmenteAlojada
LoggingLocalCentralizado

Resumen

ConceptoIdea Clave
dbtTransformaciones SQL dentro de tu warehouse
ModeloUna sentencia SELECT que se convierte en tabla/vista
ref()Enlaza modelos, construye grafo de dependencias
TestsVerificaciones de calidad de datos (unique, not null, etc.)
Materializacionesview, table, incremental, ephemeral
MacrosSQL reutilizable con Jinja
SnapshotsRastreo SCD Tipo 2
Mejor prácticastaging → intermediate → marts