В прошлом уроке у «Гонца» появилась первая модель, stg_orders. Отто доволен, но просит больше: сколько доставок у каждого курьера и на чём он ездит. Это вторая ступенька: новая модель берёт готовые stg_orders и stg_couriers, а не сырые таблицы. Значит, она должна собираться после них. Кто следит за порядком?
Рецепт и полуфабрикаты
На кухне ресторана повар пишет технологическую карту салата: «взять отварной картофель, нарезанную морковь, заправку». Он не пишет «сначала поставь картошку вариться, потом через двадцать минут нарежь морковь». Он просто ссылается на полуфабрикаты. Шеф смотрит на все карты разом и сам понимает: картофель варится раньше салата, заправка тоже, а салат идёт последним.
В dbt модель так же ссылается на другие модели, а порядок сборки выводит сам dbt.
Ссылка вместо имени таблицы
Можно написать новую модель по старинке и взять таблицу по имени:
select courier_id, count(*) as deliveries
from dbt_dev.stg_orders
group by courier_id
Работать будет, пока повезёт. Для dbt это просто текст: он не знает, что эта модель зависит от stg_orders. Если схема поменяется с dbt_dev на analytics, придётся искать имя по всем файлам. Если на пустой базе dbt решит собрать новую модель раньше stg_orders, запрос упадёт: таблицы ещё нет.
Поэтому в dbt на другие модели ссылаются функцией ref():
select courier_id, count(*) as deliveries
from {{ ref('stg_orders') }}
group by courier_id
Двойные фигурные скобки это вставка Jinja, подробно о нём в уроке про Jinja. При компиляции dbt заменит их на полное имя "gonets"."dbt_dev"."stg_orders". База, схема и имя берутся из профиля и настроек модели, поэтому в коде модели их нет. Сменится схема, ни один файл трогать не придётся.
Граф зависимостей
Каждый вызов ref() dbt записывает как стрелку: «эта модель зависит от той». Из стрелок складывается граф проекта, тот самый DAG, что и у Airflow в блоке про оркестрацию. Только там граф рисовал ты, а здесь dbt собирает его сам из кода моделей.
Порядок сборки идёт по графу: сначала модели без зависимостей, потом те, чьи предки уже готовы. Имена файлов и их порядок в папке роли не играют.
Петля в графе запрещена. Если a ссылается на b, а b на a, dbt откажется работать ещё до запуска и напишет Found a cycle.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.