Что такое dbt простыми словами
Если вы только что закончили Ступень 0 и умеете писать простые SELECT-запросы, этот урок для вас. Здесь не будет ни одного непонятного термина без объяснения. К концу урока вы будете понимать, что такое dbt, зачем он нужен и чего он точно НЕ делает.
Начнём с одной фразы, которую мы будем распаковывать весь урок:
dbt — это инструмент, который превращает ваши SQL-запросы в готовые таблицы внутри хранилища данных.
Дальше разберём каждое слово этой фразы.
Сначала: что такое “хранилище данных” на пальцах
Вы наверняка работали с базой данных: есть таблицы, в них строки, вы пишете SELECT * FROM users и получаете данные. Хранилище данных (по-английски data warehouse, часто говорят просто “warehouse”) — это тоже база данных, только заточенная под другую задачу.
Сравним две задачи на простом примере интернет-магазина:
-
Обычная база приложения. Когда пользователь нажимает “Купить”, приложение записывает одну строку: новый заказ. Когда смотрит свой профиль — читает несколько строк про себя. Тут важна скорость на маленьких операциях: одна запись, одно чтение, миллионы раз в день.
-
Хранилище данных. Аналитик хочет ответить на вопрос: “Сколько мы заработали по месяцам за прошлый год, с разбивкой по регионам?”. Это запрос, который читает миллионы строк сразу и считает по ним итоги. Тут важна скорость на больших операциях: прочитать всё, сгруппировать, посчитать суммы.
Хранилище данных — это база данных, специально устроенная так, чтобы быстро отвечать на второй тип вопросов: большие отчётные запросы по огромным объёмам. Примеры таких хранилищ: Snowflake, BigQuery, Redshift. В этом курсе мы будем использовать DuckDB — маленькое бесплатное хранилище, которое работает прямо на вашем ноутбуке, без облака и без оплаты.
Пока достаточно запомнить одно: хранилище данных — это база данных для аналитики, для больших отчётных запросов. Не пугайтесь слова “warehouse” — это просто такая база.
Какую проблему решает dbt
Представьте, что данные уже лежат в хранилище в “сыром” виде — так, как их прислала система-источник. Например, таблица raw_orders со всеми заказами, как есть: с дублями, с непонятными кодами статусов, без удобных полей.
Аналитику для отчёта нужна не такая таблица, а удобная: чистая, без дублей, с понятными названиями колонок, с уже посчитанной выручкой по каждому заказу. Чтобы получить удобную таблицу из сырой, нужно написать SQL-запрос вроде такого:
SELECT
order_id,
customer_id,
order_date,
amount * (1 - discount) AS revenue
FROM raw_orders
WHERE status = 'completed'
Этот запрос превращает сырые данные в полезные. Отлично. Но дальше начинаются проблемы.
Через полгода таких запросов уже не один, а пятьдесят. Они зависят друг от друга: один запрос читает результат другого. Кто-то поменял один запрос — сломались три других, и никто не знает, в каком порядке их пересчитывать. Запросы лежат в случайных файлах, в чатах, в головах сотрудников. Когда новый человек спрашивает “откуда взялась эта цифра выручки?” — никто не может ответить уверенно.
Вот эту проблему и решает dbt. Вместо разрозненных запросов вы кладёте каждый запрос в отдельный файл и отдаёте всё хозяйство dbt. А он:
- знает порядок, в котором запросы нужно выполнять;
- сам создаёт из каждого запроса таблицу в хранилище;
- хранит всё в одном месте, под контролем версий, с возможностью посмотреть историю.
Что значит “превращает SQL-запросы в таблицы”
Это ключевая идея, и она проще, чем кажется. Когда вы пишете SELECT ..., вы просто читаете данные — результат показывается на экране и исчезает. Он нигде не сохраняется.
dbt берёт ваш SELECT и оборачивает его так, чтобы результат сохранился как настоящая таблица в хранилище. Грубо говоря, вместо того чтобы вы каждый раз вручную писали:
CREATE TABLE clean_orders AS
SELECT order_id, customer_id, amount * (1 - discount) AS revenue
FROM raw_orders
WHERE status = 'completed';
вы пишете только сам SELECT, а слова CREATE TABLE clean_orders AS за вас допишет dbt. Файл с одним SELECT-запросом в мире dbt называется моделью. Имя файла становится именем таблицы. Вот и весь фокус на этом этапе.
То есть вы пишете логику (что выбрать), а dbt берёт на себя механику (как это сохранить таблицей и в каком порядке всё пересчитать).
Чего dbt НЕ делает: он не загружает данные
Это самый частый источник путаницы у новичков, поэтому скажем прямо и жирно: dbt не приносит данные в хранилище. Он работает только с теми данными, которые в хранилище уже есть.
Давайте разложим путь данных на три простых шага:
- Достать данные из источника (например, из системы заказов, из платёжного сервиса).
- Положить эти данные в хранилище в сыром виде.
- Превратить сырые данные в удобные таблицы для аналитики.
Шаги 1 и 2 (достать и положить) делают другие инструменты — например, Fivetran или Airbyte, либо простой скрипт. dbt в этом не участвует. dbt отвечает только за шаг 3 — превращение того, что уже лежит в хранилище, в удобные таблицы.
Если вы поставите dbt и у вас в хранилище пусто — dbt ничего не “натянет” откуда-то снаружи. Сначала данные должны попасть в хранилище другим способом, и только потом dbt их преобразует. dbt начинает работать с того момента, когда сырые данные уже на месте.
Хорошая новость для этого курса: DuckDB позволяет читать данные прямо из локальных файлов (например, CSV), так что “положить данные” в наших упражнениях будет тривиально. Но концептуально загрузка и преобразование — это две разные работы, и dbt делает только вторую.
Соберём картинку целиком
Представьте dbt как кухонного помощника, который НЕ ходит в магазин за продуктами. Продукты (сырые данные) кто-то уже принёс и сложил в холодильник (хранилище). Помощник берёт продукты из холодильника и по вашим рецептам (SQL-запросам) готовит блюда (удобные таблицы), раскладывая их обратно в холодильник в подписанные контейнеры. Вы пишете рецепты — помощник готовит и следит, чтобы соус был готов раньше, чем блюдо, которое его использует.
Три мысли, которые нужно унести из урока:
- Хранилище данных — это база данных для больших отчётных запросов аналитики (у нас это DuckDB на ноутбуке).
- dbt превращает SELECT-запросы в таблицы в хранилище: вы пишете логику, dbt берёт на себя механику.
- dbt не загружает данные — он работает только с тем, что в хранилище уже есть.
Этого достаточно, чтобы на следующем уроке своими руками запустить первый dbt-проект и увидеть, как SELECT превращается в таблицу.
Попробуй сам
Никакого кода пока не нужно — только подумать. Возьмите воображаемый интернет-магазин и распределите три задачи по трём шагам пути данных (достать / положить / превратить):
- “Каждую ночь забирать список новых заказов из системы магазина и складывать их в хранилище как есть.”
- “Из сырых заказов сделать чистую таблицу: убрать отменённые, посчитать выручку с учётом скидки.”
- “Хранить продукты в холодильнике” — то есть само хранилище.
Какую из задач 1-2 будет делать dbt? Подсказка: только ту, где сырые данные уже лежат в хранилище и их надо превратить в удобную таблицу. Задачу “достать и положить” делает другой инструмент. Если вы уверенно показываете пальцем на задачу 2 — вы поняли главное в этом уроке.