DBT (Data Build Tool)

Complete gids voor moderne data transformatie

DBT (Data Build Tool): Data Transformatie voor het Moderne Data Team

DBT workflow

Wat is DBT?

DBT (Data Build Tool) is een open-source command line tool die data analysts en engineers helpt bij het transformeren van data in hun warehouse door simpelweg select statements te schrijven. DBT voert de transformatielogica uit (de T in ELT) en maakt het mogelijk om software engineering best practices toe te passen op data pipelines.

ELT vs ETL: Bij ELT (Extract, Load, Transform) wordt data eerst geladen in het data warehouse en daarna getransformeerd, in tegenstelling tot traditionele ETL waar transformatie plaatsvindt voor het laden.

Waarom DBT gebruiken?

DBT brengt software engineering principes naar data transformaties:

DBT Project Structuur

Een typisch DBT project heeft de volgende structuur:

dbt_project/
├── dbt_project.yml       # Project configuratie
├── models/               # SQL modellen
│   ├── staging/          # Bron-specifieke transformaties
│   ├── marts/            # Business-specifieke modellen
│   └── schema.yml        # Documentatie en tests
├── seeds/                # Seed data voor lookup tabellen
├── snapshots/            # Type 2 Slowly Changing Dimensions
├── macros/               # Jinja macros voor herbruikbare code
├── tests/                # Aangepaste data tests
└── target/               # Gecompileerde SQL en logs

DBT Kernconcepten

1. Modellen (Models)

Modellen zijn SQL-bestanden die een enkele data transformatie definiëren:

-- models/marts/dim_customers.sql
WITH customer_orders AS (
  SELECT
    customer_id,
    MIN(order_date) AS first_order_date,
    MAX(order_date) AS most_recent_order_date,
    COUNT(order_id) AS number_of_orders
  FROM {{ ref('stg_orders') }}
  GROUP BY customer_id
)

SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  co.first_order_date,
  co.most_recent_order_date,
  COALESCE(co.number_of_orders, 0) AS number_of_orders
FROM {{ ref('stg_customers') }} c
LEFT JOIN customer_orders co ON c.customer_id = co.customer_id

2. Bronnen (Sources)

Definieer je raw data tabellen in YAML:

# models/sources.yml
version: 2

sources:
  - name: jaffle_shop
    database: raw
    schema: jaffle_shop
    tables:
      - name: orders
      - name: customers

3. Tests

Data kwaliteit controleren met ingebouwde tests:

# models/schema.yml
version: 2

models:
  - name: dim_customers
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null
      - name: first_order_date
        tests:
          - relationships:
              to: ref('stg_orders')
              field: order_date

4. Documentatie

Genereer automatisch data documentatie:

# models/schema.yml
version: 2

models:
  - name: dim_customers
    description: "Klantdimensietabel met historische orders"
    columns:
      - name: customer_id
        description: "Unieke identifier voor de klant"
      - name: first_name
        description: "Voornaam van de klant"

DBT Workflow in Praktijk

Stap 1: Staging Modellen

Transformeer raw data naar gestandaardiseerde staging tabellen:

-- models/staging/stg_customers.sql
SELECT
  id AS customer_id,
  first_name,
  last_name,
  email
FROM {{ source('jaffle_shop', 'customers') }}

Stap 2: Business Modellen

Bouw business-specifieke datamarts:

-- models/marts/customer_metrics.sql
SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  COUNT(o.order_id) AS order_count,
  SUM(p.amount) AS total_spend
FROM {{ ref('stg_customers') }} c
LEFT JOIN {{ ref('stg_orders') }} o ON c.customer_id = o.customer_id
LEFT JOIN {{ ref('stg_payments') }} p ON o.order_id = p.order_id
GROUP BY 1, 2, 3

Stap 3: Uitvoeren en Testen

Voer je modellen uit en test de data kwaliteit:

# Voer alle modellen uit
dbt run

# Voer tests uit
dbt test

# Genereer documentatie
dbt docs generate
dbt docs serve

Geavanceerde DBT Functies

Jinja Templating

Maak dynamische SQL met Jinja:

-- models/marts/payment_methods.sql
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}

SELECT
  order_id,
  {% for payment_method in payment_methods %}
  SUM(CASE WHEN payment_method = '{{ payment_method }}' THEN amount ELSE 0 END) AS {{ payment_method }}_amount
  {% if not loop.last %},{% endif %}
  {% endfor %}
FROM {{ ref('stg_payments') }}
GROUP BY order_id

Macros

Herbruikbare code voor veelvoorkomende patronen:

-- macros/generate_schema_name.sql
{% macro generate_schema_name(custom_schema_name, node) -%}
    {%- if custom_schema_name is none -%}
        {{ target.schema }}
    {%- else -%}
        {{ custom_schema_name | trim }}
    {%- endif -%}
{%- endmacro %}

Snapshots

Track historische veranderingen in je data:

-- snapshots/customer_snapshot.sql
{% snapshot customer_snapshot %}

{{
    config(
      target_schema='snapshots',
      unique_key='customer_id',
      strategy='timestamp',
      updated_at='updated_at',
    )
}}

SELECT * FROM {{ source('jaffle_shop', 'customers') }}

{% endsnapshot %}

DBT Cloud vs DBT Core

DBT Core: Open-source CLI tool (gratis)

DBT Cloud: Beheerde service met UI, scheduling en monitoring (betaald)

Best Practices

Conclusie

DBT heeft zich bewezen als een essentieel tool voor moderne data teams. Door het combineren van SQL met software engineering best practices zoals versiebeheer, testing en documentatie, stelt DBT teams in staat om betrouwbaardere en onderhoudbaardere data pipelines te bouwen.

Of je nu een data analyst bent die meer controle wil over transformaties, of een data engineer die schaalbare data modellen wil bouwen, DBT biedt de tools om je workflow te verbeteren.

Wil je zelf direct met DBT aan de slag? Bekijk dan mijn complete praktische dbt-handleiding (€7), inclusief voorbeelden, projectstructuur en geavanceerde technieken. Perfect voor data engineers en BI-professionals die hun data pipelines willen professionaliseren.

← Terug naar Blog Overzicht