dbt (Data Build Tool): Analytics Engineering Moderno para Pipelines de Dados

O que é dbt?
dbt (data build tool) é uma ferramenta open-source de transformação de dados que permite que analistas e engenheiros de dados transformem dados em seus data warehouses usando comandos SQL familiares, combinados com as melhores práticas de engenharia de software — testes, documentação, versionamento e CI/CD. Criado por Tristan Handy em 2016 e mantido pela dbt Labs, o dbt se tornou o padrão de facto para o que hoje chamamos de Analytics Engineering.
Diferente de ferramentas tradicionais de ETL que movem dados entre sistemas, o dbt opera diretamente dentro do data warehouse (Snowflake, BigQuery, Redshift, Databricks, DuckDB, entre outros), executando transformações SQL após os dados já terem sido carregados. Esse paradigma é conhecido como ELT (Extract, Load, Transform), onde o carregamento acontece antes da transformação.
Por que dbt revolucionou a área de dados?
Antes do dbt, transformações de dados eram tipicamente feitas com:
- Stored procedures: Difíceis de versionar, testar e depurar.
- Python scripts: Complexos de manter, sem linhagem automática.
- GUI-based ETL tools: Caras, proprietárias e com curva de aprendizado alta.
O dbt resolve todos esses problemas ao tratar a transformação de dados como código — SQL modular, testável e versionado no Git. Isso trouxe para a área de dados os mesmos benefícios que o Git trouxe para o desenvolvimento de software.
Conceitos Fundamentais
Models (Modelos)
Models são o coração do dbt. Cada model é um arquivo .sql que contém uma consulta SELECT. Quando você executa dbt run, o dbt transforma esse SELECT em uma tabela ou visão no seu warehouse.
-- models/stg_orders.sql
-- Model de staging: limpeza e padronização inicial
WITH source AS (
SELECT * FROM {{ source('ecommerce', 'orders') }}
)
SELECT
id AS order_id,
customer_id,
CAST(order_date AS DATE) AS order_date,
status,
COALESCE(amount, 0) AS amount,
_loaded_at
FROM source
WHERE status IS NOT NULLMaterializations
O dbt oferece diferentes formas de materializar seus models no warehouse:
- view: Cria uma view SQL (padrão para modelos de staging). Leve e sempre atualizada.
- table: Cria uma tabela física. Mais rápida para consultas, mas precisa ser recriada.
- incremental: Apenas novas linhas ou alterações. Ideal para grandes volumes de dados.
- ephemeral: Não materializa — funciona como CTE reutilizável em outros modelos.
-- Configuração de materialização incremental
{{
config(
materialized='incremental',
unique_key='order_id',
incremental_strategy='merge'
)
}}
SELECT * FROM {{ ref('stg_orders') }}
{% if is_incremental() %}
WHERE _loaded_at > (SELECT MAX(_loaded_at) FROM {{ this }})
{% endif %}Ref e Source: Gerenciamento de Dependências
O dbt usa duas funções Jinja especiais para gerenciar o grafo de dependências entre models:
{{ ref('model_name') }}: Referencia outro model dbt. O dbt constrói automaticamente a ordem de execução baseada nessas referências.{{ source('source_name', 'table') }}: Referencia uma tabela bruta no warehouse, registrada no arquivosources.yml.
Testes de Dados
Uma das funcionalidades mais poderosas do dbt é a capacidade de testar seus dados de forma declarativa:
-- schema.yml
version: 2
models:
- name: stg_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['pending', 'shipped', 'delivered', 'cancelled']
- name: amount
tests:
- dbt_utils.expression_is_true:
expression: >= 0Execute com dbt test e veja exatamente quais registros falharam, com mensagens claras e rastreáveis.
Linhagem de Dados (Lineage)
O dbt gera automaticamente um grafo de linhagem (DAG — Directed Acyclic Graph) baseado nas referências ref() entre seus models. Você pode visualizar esse grafo executando dbt docs generate e depois dbt docs serve, que abre uma interface web interativa mostrando:
- Quais tabelas alimentam quais models
- O impacto de alterar um model específico
- A linhagem completa de uma coluna desde a fonte bruta até o dashboard
Documentação Automatizada
No dbt, a documentação vive junto com o código. Você pode descrever models, colunas e fontes diretamente nos arquivos YML:
version: 2
models:
- name: dim_customers
description: "Dimensão de clientes consolidada, uma linha por cliente."
columns:
- name: customer_id
description: "Chave primária do cliente."
tests:
- unique
- not_null
- name: lifetime_value
description: "Receita total gerada pelo cliente durante todo o histórico."Execute dbt docs generate e a documentação é gerada automaticamente com colunas, descrições, linhagem e resultados de testes — tudo em uma única interface web.
Macros e Pacotes (Packages)
O dbt usa Jinja como motor de templates, permitindo criar macros reutilizáveis e até mesmo publicar pacotes completos:
-- macros/calculate_margin.sql
{% macro calculate_margin(revenue, cost) %}
CASE
WHEN {{ revenue }} > 0
THEN ({{ revenue }} - {{ cost }}) / {{ revenue }} * 100
ELSE 0
END
{% endmacro %}
-- Usando a macro em um model
SELECT
order_id,
{{ calculate_margin('revenue', 'cost') }} AS margin_pct
FROM {{ ref('stg_orders') }}Pacotes populares incluem dbt_utils (funções auxiliares), dbt_expectations (testes avançados) e dbt_artifacts (métricas de execução).
CI/CD e Deploy
O dbt se integra nativamente com Git e pipelines de CI/CD. Um fluxo típico de trabalho:
- Desenvolvedor cria uma branch com novos models ou alterações.
- CI executa
dbt build --select state:modified+para compilar e testar apenas os models alterados e seus dependentes. - Revisão de código via Pull Request — os revisores veem exatamente quais colunas e transformações mudaram.
- Merge na main dispara o deploy via
dbt buildcompleto ou incremental.
# .github/workflows/dbt_ci.yml
name: dbt CI
on:
pull_request:
branches: [main]
jobs:
dbt-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dbt
run: pip install dbt-snowflake
- name: Run dbt
run: dbt build --select state:modified+
env:
DBT_USER: ${{ secrets.DBT_USER }}
DBT_PASSWORD: ${{ secrets.DBT_PASSWORD }}Estrutura de um Projeto dbt
Um projeto dbt bem organizado segue uma convenção clara:
meu_projeto_dbt/
├── models/ # Models SQL organizados por camada
│ ├── staging/ # Dados brutos, limpeza inicial
│ ├── marts/ # Models prontos para consumo
│ │ ├── core/ # Dimensões e fatos centrais
│ │ └── finance/ # Models específicos do time financeiro
├── tests/ # Testes genéricos customizados
├── macros/ # Macros Jinja reutilizáveis
├── analyses/ # Consultas exploratórias (não materializam)
├── seeds/ # Arquivos CSV carregados como tabelas
├── snapshots/ # Tabelas tipo 2 para dados que mudam
├── dbt_project.yml # Configuração principal do projeto
├── packages.yml # Dependências de pacotes externos
└── profiles.yml # Conexão com o data warehousedbt vs. Ferramentas Tradicionais
| Característica | dbt | Python Scripts | GUI ETL (Informatica, Talend) |
|---|---|---|---|
| Curva de aprendizado | Baixa (SQL) | Média-Alta | Alta (proprietário) |
| Versionamento Git | Nativo | Manual | Limitado |
| Linhagem automática | Sim | Não | Parcial |
| Testes de dados | Declarativos nativos | Customizados | Limitados |
| Documentação | Automática (docs generate) | Manual | Manual |
| Open-source | Sim | Sim | Não (caro) |
Quando usar (e não usar) dbt
O dbt é ideal quando:
- Seus dados já estão carregados em um data warehouse moderno (Snowflake, BigQuery, Redshift, Databricks, DuckDB).
- Suas transformações podem ser expressas em SQL — que é o caso da maioria das análises de negócio.
- Você quer aplicar CI/CD, testes e documentação aos seus pipelines de dados.
- Seu time tem perfil de Analytics Engineering — analistas que codificam ou engenheiros que pensam em negócio.
Não é a melhor escolha quando:
- Você precisa de transformações complexas fora do SQL (processamento de imagens, ML training). Para isso, Ferramentas como Airflow + Python são mais adequadas.
- Seu data warehouse não suporta execução SQL direta (dados em Data Lakes com Spark, por exemplo — nesse caso, considere dbt Spark ou Apache Iceberg).
- Você precisa de orquestração entre múltiplos sistemas (API calls, FTP). dbt não substitui um orquestrador como Airflow, Dagster ou Prefect — mas funciona dentro deles.
Ecosystemo e dbt Cloud
A dbt Labs oferece o dbt Cloud, uma plataforma SaaS que adiciona ao dbt open-source:
- IDE baseada na web para desenvolvimento colaborativo.
- Orquestração de jobs com schedule e notificações.
- Observabilidade e alertas integrados.
- dbt Semantic Layer para métricas definidas no dbt consumidas por ferramentas de BI.
- Ambientes de desenvolvimento, staging e produção isolados.
O Semantic Layer, em particular, é inovador: você define métricas (receita, churn, LTV) uma vez no dbt e elas ficam disponíveis para qualquer ferramenta de BI (Tableau, Power BI, Metabase, Looker) com definição única e consistente.
Conclusão
O dbt transformou a maneira como equipes de dados trabalham. Ao tratar transformação de dados como software — com código modular, testes, documentação automatizada e CI/CD — ele trouxe rigor e produtividade para uma área que por décadas dependia de processos frágeis e pouco transparentes.
Se você trabalha com dados e ainda não experimentou o dbt, comece com pip install dbt-core e explore o tutorial oficial (jaffle shop). Em poucas horas você terá seu primeiro pipeline de dados versionado, testado e documentado. O Analytics Engineering é o presente e o futuro da área de dados — e o dbt é a ferramenta que lidera essa transformação.







