Раздел 26 · Data Engineering

ref() и автоматический граф моделей

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке у «Гонца» появилась первая модель, 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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.