Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 02.01 · 14 мин
Начальный
dbt-introdata-warehousesqlbeginner

Что такое dbt простыми словами

Если вы только что закончили Ступень 0 и умеете писать простые SELECT-запросы, этот урок для вас. Здесь не будет ни одного непонятного термина без объяснения. К концу урока вы будете понимать, что такое dbt, зачем он нужен и чего он точно НЕ делает.

Начнём с одной фразы, которую мы будем распаковывать весь урок:

dbt — это инструмент, который превращает ваши SQL-запросы в готовые таблицы внутри хранилища данных.

Дальше разберём каждое слово этой фразы.


Сначала: что такое “хранилище данных” на пальцах

Вы наверняка работали с базой данных: есть таблицы, в них строки, вы пишете SELECT * FROM users и получаете данные. Хранилище данных (по-английски data warehouse, часто говорят просто “warehouse”) — это тоже база данных, только заточенная под другую задачу.

Сравним две задачи на простом примере интернет-магазина:

  • Обычная база приложения. Когда пользователь нажимает “Купить”, приложение записывает одну строку: новый заказ. Когда смотрит свой профиль — читает несколько строк про себя. Тут важна скорость на маленьких операциях: одна запись, одно чтение, миллионы раз в день.

  • Хранилище данных. Аналитик хочет ответить на вопрос: “Сколько мы заработали по месяцам за прошлый год, с разбивкой по регионам?”. Это запрос, который читает миллионы строк сразу и считает по ним итоги. Тут важна скорость на больших операциях: прочитать всё, сгруппировать, посчитать суммы.

Хранилище данных — это база данных, специально устроенная так, чтобы быстро отвечать на второй тип вопросов: большие отчётные запросы по огромным объёмам. Примеры таких хранилищ: Snowflake, BigQuery, Redshift. В этом курсе мы будем использовать DuckDB — маленькое бесплатное хранилище, которое работает прямо на вашем ноутбуке, без облака и без оплаты.

NOTE

Пока достаточно запомнить одно: хранилище данных — это база данных для аналитики, для больших отчётных запросов. Не пугайтесь слова “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. Положить эти данные в хранилище в сыром виде.
  3. Превратить сырые данные в удобные таблицы для аналитики.

Шаги 1 и 2 (достать и положить) делают другие инструменты — например, Fivetran или Airbyte, либо простой скрипт. dbt в этом не участвует. dbt отвечает только за шаг 3 — превращение того, что уже лежит в хранилище, в удобные таблицы.

WARNING

Если вы поставите dbt и у вас в хранилище пусто — dbt ничего не “натянет” откуда-то снаружи. Сначала данные должны попасть в хранилище другим способом, и только потом dbt их преобразует. dbt начинает работать с того момента, когда сырые данные уже на месте.

Хорошая новость для этого курса: DuckDB позволяет читать данные прямо из локальных файлов (например, CSV), так что “положить данные” в наших упражнениях будет тривиально. Но концептуально загрузка и преобразование — это две разные работы, и dbt делает только вторую.


Соберём картинку целиком

Представьте dbt как кухонного помощника, который НЕ ходит в магазин за продуктами. Продукты (сырые данные) кто-то уже принёс и сложил в холодильник (хранилище). Помощник берёт продукты из холодильника и по вашим рецептам (SQL-запросам) готовит блюда (удобные таблицы), раскладывая их обратно в холодильник в подписанные контейнеры. Вы пишете рецепты — помощник готовит и следит, чтобы соус был готов раньше, чем блюдо, которое его использует.

Три мысли, которые нужно унести из урока:

  1. Хранилище данных — это база данных для больших отчётных запросов аналитики (у нас это DuckDB на ноутбуке).
  2. dbt превращает SELECT-запросы в таблицы в хранилище: вы пишете логику, dbt берёт на себя механику.
  3. dbt не загружает данные — он работает только с тем, что в хранилище уже есть.

Этого достаточно, чтобы на следующем уроке своими руками запустить первый dbt-проект и увидеть, как SELECT превращается в таблицу.


Попробуй сам

Никакого кода пока не нужно — только подумать. Возьмите воображаемый интернет-магазин и распределите три задачи по трём шагам пути данных (достать / положить / превратить):

  1. “Каждую ночь забирать список новых заказов из системы магазина и складывать их в хранилище как есть.”
  2. “Из сырых заказов сделать чистую таблицу: убрать отменённые, посчитать выручку с учётом скидки.”
  3. “Хранить продукты в холодильнике” — то есть само хранилище.

Какую из задач 1-2 будет делать dbt? Подсказка: только ту, где сырые данные уже лежат в хранилище и их надо превратить в удобную таблицу. Задачу “достать и положить” делает другой инструмент. Если вы уверенно показываете пальцем на задачу 2 — вы поняли главное в этом уроке.


Проверка знанийKnowledge check
Почему говорят, что "dbt не загружает данные", и какой инструмент тогда отвечает за попадание сырых данных в хранилище?
ОтветAnswer
dbt отвечает только за преобразование данных, которые УЖЕ лежат в хранилище: он берёт ваши SELECT-запросы и превращает их результаты в готовые таблицы. Он не умеет и не должен доставать данные из систем-источников и класть их в хранилище. За это отвечают отдельные инструменты загрузки — например, Fivetran, Airbyte или простой скрипт. То есть путь данных делится на три шага: достать из источника, положить в хранилище сырыми (этим занимаются инструменты загрузки), и превратить сырые данные в удобные таблицы (а вот это уже работа dbt). Если хранилище пустое, dbt ничего не сможет сделать, пока данные туда не попадут другим способом.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3