dbt — что это и зачем аналитику
Что такое dbt
dbt (data build tool) — инструмент для трансформации данных внутри хранилища с помощью SQL. Вместо того чтобы писать запросы руками и следить за порядком выполнения, вы описываете модели — SQL-файлы с SELECT-запросами. dbt сам разбирается, в каком порядке их запускать, и создаёт таблицы или вью в вашем хранилище.
Проще говоря: dbt берёт на себя «T» в ELT — трансформацию. Вы пишете SQL, dbt делает всё остальное: определяет зависимости, запускает в правильном порядке, тестирует результат.
Почему это важно для аналитика: раньше трансформации делали data-инженеры на Python. С dbt аналитик, который знает SQL, может сам управлять логикой подготовки данных — от сырых таблиц до готовых витрин для дашбордов. Это называется «analytics engineering» — и это одна из самых востребованных специализаций.
ELT vs ETL — почему dbt стал возможен
В классическом ETL данные трансформируются до загрузки в хранилище. Нужен отдельный сервер, Python-скрипты, Airflow — инфраструктурная работа для инженеров.
В ELT данные сначала загружаются сырыми в хранилище (Fivetran, Airbyte, Stitch), а трансформируются внутри хранилища SQL-запросами. Это стало возможным с появлением мощных облачных DWH: BigQuery, Snowflake, Redshift, ClickHouse. Вычисления дешёвые, SQL быстрый — зачем усложнять?
dbt — идеальный инструмент для ELT: он не извлекает и не загружает данные, а только трансформирует то, что уже в хранилище.
Как работает dbt
Модель (Model)
Модель — SQL-файл с SELECT-запросом. dbt выполняет этот SELECT и создаёт таблицу (table) или представление (view) в хранилище.
Файл models/mart/daily_revenue.sql:
SELECT
DATE(order_date) AS day,
COUNT(*) AS order_count,
SUM(amount) AS revenue,
AVG(amount) AS avg_check
FROM {{ ref('stg_orders') }}
WHERE status = 'completed'
GROUP BY DATE(order_date){{ ref('stg_orders') }} — ссылка на другую модель. dbt по этим ссылкам строит граф зависимостей и запускает модели в правильном порядке: сначала stg_orders, потом daily_revenue.
ref() — ключ к автоматизации
ref() — главная функция dbt. Она делает две вещи:
- Определяет зависимость — dbt знает, что
daily_revenueзависит отstg_orders - Подставляет правильное имя таблицы — в dev-окружении это
dev_schema.stg_orders, в prod —prod_schema.stg_orders
Никаких хардкодов имён таблиц. Если переименовали модель — все зависимости обновятся автоматически.
source() — подключение сырых данных
Для сырых таблиц, которые не являются моделями dbt, используется source():
-- models/staging/stg_orders.sql
SELECT
id AS order_id,
user_id,
amount,
created_at AS order_date,
status
FROM {{ source('production', 'orders') }}
WHERE created_at >= '2025-01-01'Sources описываются в YAML:
# models/staging/sources.yml
sources:
- name: production
tables:
- name: orders
- name: usersСтруктура dbt-проекта
my_project/
├── dbt_project.yml # конфигурация проекта
├── models/
│ ├── staging/ # очистка сырых данных
│ │ ├── stg_orders.sql
│ │ ├── stg_users.sql
│ │ └── sources.yml
│ ├── intermediate/ # промежуточные расчёты
│ │ └── int_user_orders.sql
│ └── mart/ # готовые витрины
│ ├── daily_revenue.sql
│ └── user_ltv.sql
├── tests/ # кастомные тесты
└── macros/ # переиспользуемые SQL-шаблоныТри слоя — стандартная конвенция:
- staging — один-к-одному с источниками. Минимальные преобразования: переименование колонок, приведение типов, фильтрация
- intermediate — бизнес-логика, джойны, агрегации. Используются как строительные блоки
- mart — готовые витрины для дашбордов и отчётов. Это то, что видит бизнес
Тесты
dbt позволяет тестировать данные — не код, а результат трансформации:
# models/mart/schema.yml
models:
- name: daily_revenue
columns:
- name: day
tests:
- not_null
- unique
- name: revenue
tests:
- not_nullВстроенные тесты: not_null, unique, accepted_values, relationships. Можно писать кастомные — это обычные SELECT, которые должны вернуть 0 строк при успехе.
Тесты запускаются после каждого билда. Если day содержит NULL — dbt сообщит об ошибке. Это критически важно: без тестов вы не узнаете о проблемах с данными, пока менеджер не придёт с вопросом «почему дашборд показывает нули».
Зачем аналитику знать dbt
Самостоятельность. Без dbt аналитик зависит от data-инженера: «добавь колонку в витрину», «исправь логику расчёта LTV». С dbt аналитик сам меняет SQL-модель, пушит в Git, запускает билд. Цикл обратной связи — минуты, а не дни.
Версионирование. Все модели в Git. Можно посмотреть историю изменений, сделать ревью, откатить. Это культура работы с данными, которую ценят на собеседованиях.
Документация. dbt генерирует документацию автоматически: граф зависимостей, описания моделей и колонок, тесты. Новый аналитик видит, как устроено хранилище, за минуты.
Рынок. «dbt» в вакансиях аналитиков появляется всё чаще. В крупных компаниях (Яндекс, Тинькофф, Авито) аналитики уже работают с dbt или его аналогами.
dbt Cloud vs dbt Core
| dbt Core | dbt Cloud | |
|---|---|---|
| Цена | Бесплатно (open-source) | От $100/мес |
| Запуск | CLI, нужна инфраструктура | Веб-интерфейс, SaaS |
| Расписание | Через Airflow/cron | Встроенный scheduler |
| IDE | Свой редактор | Встроенный веб-IDE |
| CI/CD | Настраиваете сами | Из коробки |
Для изучения и pet-проектов — dbt Core. Для команды — dbt Cloud или Core + Airflow.
Пример: от сырых данных до витрины
Допустим, у нас есть сырые таблицы raw_orders и raw_users. Нужна витрина с LTV пользователей.
Шаг 1 — staging:
-- models/staging/stg_orders.sql
SELECT
id AS order_id,
user_id,
amount,
created_at AS order_date
FROM {{ source('production', 'raw_orders') }}
WHERE amount > 0Шаг 2 — intermediate:
-- models/intermediate/int_user_orders.sql
SELECT
user_id,
COUNT(*) AS total_orders,
SUM(amount) AS total_revenue,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM {{ ref('stg_orders') }}
GROUP BY user_idШаг 3 — mart:
-- models/mart/user_ltv.sql
SELECT
o.user_id,
u.signup_date,
o.total_orders,
o.total_revenue AS ltv,
o.first_order,
o.last_order,
o.last_order - u.signup_date AS lifetime_days
FROM {{ ref('int_user_orders') }} o
JOIN {{ ref('stg_users') }} u ON u.user_id = o.user_idТри файла, чистый SQL, CTE не нужны — dbt сам управляет зависимостями.
Вопросы с собеседований
Что такое dbt и какую проблему решает? — Data build tool — инструмент трансформации данных внутри хранилища через SQL. Решает проблему управления SQL-моделями: зависимости, порядок выполнения, тесты, документация. Позволяет аналитикам самостоятельно менять логику подготовки данных.
Что делает функция ref()? — Ссылается на другую модель. Определяет зависимость (dbt строит граф и запускает в правильном порядке) и подставляет корректное имя таблицы в зависимости от окружения.
Чем ELT отличается от ETL и при чём тут dbt? — В ETL данные трансформируются до загрузки (на отдельном сервере). В ELT — после загрузки, внутри хранилища. dbt — инструмент для «T» в ELT: трансформация SQL-запросами в хранилище.
Какие тесты есть в dbt? — Встроенные: not_null, unique, accepted_values, relationships. Кастомные: SQL-запрос, который должен вернуть 0 строк. Тесты проверяют данные, а не код — это data quality проверки.
Как устроена структура dbt-проекта? — Три слоя моделей: staging (очистка сырых данных), intermediate (бизнес-логика), mart (готовые витрины). Плюс sources (описание сырых таблиц), tests и macros.
FAQ
Можно ли использовать dbt без хранилища данных?
Нет. dbt выполняет SQL внутри хранилища: BigQuery, Snowflake, Redshift, PostgreSQL, ClickHouse. Без хранилища dbt нечего трансформировать. Для pet-проекта подойдёт бесплатный PostgreSQL или BigQuery sandbox.
Сложно ли освоить dbt?
Если вы знаете SQL — нет. Основная работа в dbt — писать SELECT-запросы. Специфичные концепции (ref, source, Jinja-шаблоны) осваиваются за пару дней. Официальный туториал dbt Fundamentals занимает 4-5 часов.
dbt заменяет Airflow?
Нет. dbt трансформирует данные (T в ELT), Airflow оркестрирует задачи (когда и в каком порядке запускать). Часто используются вместе: Airflow запускает dbt run по расписанию. dbt Cloud имеет встроенный scheduler, но для полноценной оркестрации (извлечение, загрузка, алерты) всё равно нужен Airflow или аналог.
Потренируйте вопросы по SQL и дата-инженерии на реальных задачах — откройте тренажёр. 1500+ вопросов, которые спрашивают на собеседованиях аналитика. Бесплатно.