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 из 0
Концептуальный
Вопрос 1 из 3. Что такое хранилище данных (data warehouse) простыми словами?

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

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

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

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