Обсудить
бизнес-задачи

Применение dbt (data build tool) в разработке классического хранилища данных

блог о bi, №1 в рунете
Data Build Tool (dbt) стал незаменимым инструментом для аналитиков и инженеров данных, оптимизирующим процессы трансформации и управления данными в современных хранилищах данных (Data Warehouse).
Благодаря описанию ацикличных зависимостей и автоматизации построения моделей, dbt позволяет поддерживать консистентность и актуальность аналитических данных: фреймворк помогает собрать в одном месте и связать всю логику — от исходных данных до итоговых результатов и их переиспользования.
Опыт применения dbt был получен нами при разработке реального хранилища данных заказчика, которое успешно функционирует и поддерживается более года, что подтверждает надёжность и эффективность данного инструмента в промышленной эксплуатации.
Модель в dbt — это SQL-запрос, который превращает сырые данные в готовую таблицу или представление, при этом задаётся настройка хранения и описание данных с возможностью тестирования (например, внутренние автотесты можно настроить на проверку уникальности значений в столбце, наличие дубликатов, отсутствие NULL-значений или соответствие данных заданному шаблону). Иными словами, модель представляет собой этап трансформации данных.
Для динамической генерации SQL-кода, что существенно повышает гибкость и автоматизацию при создании моделей, сценариев и конфигураций, в dbt активно используют шаблоны Jinja.
В ситуациях, когда справочники в хранилищах постоянно пополняются, оптимальным подходом становится стратегия «merge» с материализацией типа «incremental». Такой метод позволяет обновлять только новые или изменённые записи, модифицируя существующую таблицу без необходимости её полного пересоздания.
Пример конфигурации запроса в dbt-модели к таблице-источнику данных для обновления справочника:
{{
    config(
        alias='dim_countries',
        materialized="incremental",
        incremental_strategy="merge",
        unique_key = "country_guid",
    )
}}
Модель с такой конфигурацией обновляет только изменённые или новые записи в справочнике по уникальному ключу.
Для уменьшения времени отклика при работе с большими объемами данных, обеспечения более быстрого и ресурсосберегающего доступа к модели и повышения эффективности выполнения запросов к справочнику можно создать кластеризованный индекс в post-hook (скрипт SQL, который выполняет дополнительные действия с целевой таблицей на этапе постобработки dbt-модели).
post_hook  = [
    "{% if not is_incremental() %}
          create unique clustered index ix_u_cl_{{ this.name }}_country_guid on {{ this }} (country_guid);
      {% endif %}"
    ]
Поскольку индекс формируется единожды при создании таблицы, в скрипте post-hook используется условие «if not is_incremental()». Оно гарантирует, что создание индекса выполняется только при первоначальном построении модели или её полном пересоздании с помощью параметра --full-refresh, исключая повторное выполнение этой операции при инкрементальных обновлениях.
Пример полной dbt-модели справочника с инкрементальным обновлением:
{{
    config(
        alias='dim_countries',
        schema='1c_erp',
        materialized="incremental",
        incremental_strategy="merge",
        unique_key = "country_guid",
        post_hook=[
            "{% if not is_incremental() %}
            create unique clustered index ix_u_cl_{{ this.name }}_country_guid on {{ this }} (country_guid);
            {% endif %}",
        ],
    )
}}

select
  country_guid,
  coalesce(country_id,'Не задано') as country_id,
  coalesce(country_name,'Не задано') as country_name
from {{ ref('stg_1C_ERP_reference_countries') }}
В заключение можно уверенно сказать, что использование dbt позволяет значительно упростить и стандартизировать процессы трансформации данных, обеспечивая прозрачность и повторяемость аналитических моделей. Интеграция шаблонов Jinja предоставляет гибкие механизмы генерации динамического SQL, что позволяет легко адаптировать модели под различные бизнес-задачи.

Вывод

Опыт реальной эксплуатации хранилища, построенного с использованием dbt на протяжении более года подтверждает его стабильность, масштабируемость и удобство поддержки. Таким образом, dbt демонстрирует себя как надёжное и эффективное решение для построения современных аналитических платформ.