Гайды

Основы dbt для трансформации данных

Модели и материализация, тесты и документация, окружения dev/prod и CI.

~9 мин чтения

Основы dbt для трансформации данных

dbt (data build tool) — SQL-трансформации в warehouse с версионированием, тестами и документацией; компилирует в views/tables/incremental модели. Оркестрация загрузки — часто AirflowData pipelines с Apache Airflow; SQL в курсе — тег PostgreSQL.


1. Структура проекта

text
models/
  staging/stg_orders.sql
  marts/fct_orders.sql
schema.yml   # тесты и описания
dbt_project.yml

2. Материализация

view, table, incremental с уникальным ключом — выбор под объём и свежесть.

Пример слоя stagingmart (синтаксис зависит от warehouse; ниже — универсальная идея):

sql
-- models/staging/stg_orders.sql
select
  id as order_id,
  cast(order_date as date) as order_date,
  trim(lower(email)) as customer_email
from {{ source('raw', 'orders') }}
sql
-- models/marts/fct_orders.sql
{{ config(materialized='incremental', unique_key='order_id') }}

select
  o.order_id,
  o.order_date,
  c.customer_sk
from {{ ref('stg_orders') }} o
left join {{ ref('dim_customer') }} c on o.customer_email = c.email
{% if is_incremental() %}
  where o.order_date > (select max(order_date) from {{ this }})
{% endif %}

{{ ref() }} и {{ source() }} строят lineage в документации dbt; не ссылайтесь на сырые таблицы напрямую из marts без staging.


3. Тесты

unique, not_null, relationships, custom tests в SQL.


4. Окружения

target: dev/prod с разными схемами/ролями; CI прогон dbt build на PR.


5. Слои: staging → marts

Staging (stg_*) — тонкий слой над сырыми таблицами: переименование, приведение типов, базовая очистка. Intermediate — при необходимости. Marts (fct_*, dim_*) — бизнес-готовые сущности для BI. Так проще тестировать и переиспользовать.


6. Macros и packages

Jinja macros для повторяющихся фрагментов SQL; dbt-utils и другие пакеты через packages.yml. Фиксируйте версии пакетов, чтобы CI не ломался от мажорного обновления.


7. Производительность

Инкрементальные модели с unique_key и окном по updated_at; избегайте full_refresh в проде без окна обслуживания. Кластеризация/сортировка таблицы — по паттерну запросов warehouse (Snowflake, BigQuery, Redshift отличаются).


8. Чек-лист

  • Источники (sources) явно описаны.
  • Документация docs и lineage в dbt docs site.
  • Не смешивать тяжёлую бизнес-логику в одной гигантской модели.
  • --select в CI для ускорения прогона изменённых моделей.
  • Политика доступа к prod target только из защищённого runner'а.

Дальше: ClickHouse: введение