Утром Отто пишет: в справочнике зон поменяли название района, и дашборд показывает старое. Пересобирать весь проект ради одной модели долго, а собрать только stg_zones мало: витрины, которые из неё читают, останутся со старыми данными. Нужно собрать модель и всё, что от неё зависит. Для этого у dbt есть селекторы.
Генеалогическое древо
Представь семейное древо. Можно позвать на праздник одного человека, а можно его со всеми детьми и внуками. Или со всеми родителями, бабушками и дедушками. Или только тех, кто живёт в одном городе.
Граф dbt устроен так же. У модели есть предки, от которых она зависит, и потомки, которые читают её. Селектор говорит, кого из этой семьи позвать.
Три главные команды
dbt runсобирает модели и ничего не проверяет;dbt testгоняет тесты по уже собранным моделям;dbt buildделает всё по графу: сиды, снапшоты, модели и тесты. Тесты модели идут сразу после неё, и если тест упал, потомки этой модели пропускаются.
На проде почти всегда запускают dbt build: сломанная таблица не уедет дальше в витрины.
Селекторы
Все три команды принимают --select, коротко -s. Вот основные формы:
| Селектор | Что выберет |
|---|---|
stg_orders | одну модель |
+fct_deliveries | модель и всех её предков |
stg_zones+ | модель и всех её потомков |
1+fct_deliveries | модель и только прямых родителей |
+fct_deliveries+ | предков, саму модель и потомков |
tag:daily | всё с тегом daily |
path:models/marts | всё из папки |
stg_orders stg_zones | обе модели: пробел значит «или» |
tag:daily,path:models/marts | только то, что подходит под оба: запятая значит «и» |
Плюс слева значит «вместе с предками», справа «вместе с потомками». Цифра перед плюсом ограничивает глубину.
--exclude убирает узлы из выборки и понимает тот же язык: dbt build -s stg_zones+ --exclude mart_zone_daily соберёт потомков зон, кроме витрины.
Тесты dbt добирает сам: если выбрана модель, в dbt build и dbt test попадут и её тесты. Это называется косвенным выбором.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.