Раздел 26 · Data Engineering

Хранилища, адаптеры, хуки и операции

junior~15 мин

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

«Гонец» растёт, и финансовый директор спрашивает, не пора ли переехать из Postgres в облачное хранилище вроде Snowflake. Тебе интересно другое: придётся ли переписывать весь проект dbt. А ещё у тебя копится служебный SQL, который не тянет на модель: проанализировать таблицу после сборки, записать в журнал время запуска, раздать права на схему. Куда его девать?

Переходник для розетки

В поездке за границу ноутбук не переделывают под чужие розетки. Покупают переходник: ноутбук тот же, вилка та же, а переходник подгоняет её под местный стандарт.

dbt устроен так же. Ядро dbt одинаковое для всех хранилищ: проект, граф, Jinja, тесты. А с конкретной базой разговаривает адаптер, переходник под её диалект SQL.

Адаптеры

Адаптер ставится отдельным пакетом рядом с dbt Core, и его тип указывают в профиле в ключе type:

ХранилищеПакетГде живёт
PostgreSQLdbt-postgresсвоя база, как у «Гонца»
Snowflakedbt-snowflakeоблачное хранилище
Google BigQuerydbt-bigqueryоблако Google
Amazon Redshiftdbt-redshiftоблако Amazon
Databricksdbt-databricksлейкхаус на Spark
DuckDBdbt-duckdbфайл на ноутбуке, удобно для учёбы

При переезде модели почти не меняются: ref(), source(), материализации и тесты работают везде. Переписывать придётся места, где ты писал диалект руками, например at time zone или ::date из Postgres. Поэтому такие вещи прячут в макросы: поменял макрос, и проект заговорил на новом диалекте. Пакет dbt_utils из урока про макросы так и сделан.

Хуки модели

Хук это SQL, который dbt выполнит сам в нужный момент. Хуки модели задаются в конфиге:

{{ config(post_hook="analyze {{ this }}") }}

select ...

pre_hook выполняется до сборки модели, post_hook после. analyze обновляет статистику таблицы, чтобы Postgres выбирал хорошие планы запросов. {{ this }} внутри хука подставит полное имя модели.

Хуки можно писать и для целой папки в dbt_project.yml, ключом +post-hook.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

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