Skip to content

Типы моделей dbt

dbt позволяет создавать модели со следующими типами:

  • view
  • table
  • incremental
  • ephemeral

Тип materialized_view не поддерживается в Datapulse

view

В DWH создается view и пересоздается каждый раз при запуске модели. Плюсы:

  • не хранит данные физически
  • легко поддерживать

Минусы:

  • каждый раз выполняет SQL-запрос к источнику (может быть долго)
  • При пересоздании view dbt делает drop cascade! Поэтому все зависимые от view объекты будут автоматически удалены!

table

В DWH создается таблица и пересоздается каждый раз при запуске модели.

Плюсы:

  • Таблицы быстрее отдают данные, нежели view

Минусы:

  • Могут долго перестраиваться, так как вся таблица сперва удаляется, а потом создается заново.
  • При пересоздании table dbt делает drop cascade! Поэтому все зависимые от table объекты будут автоматически удалены!

incremental

В DWH создается таблица и не пересоздается при обновлении, а обновляется новыми данными.

Плюсы:

  • Обновляется быстрее, чем table (если установлен инкремент)
  • Не пересоздается путем drop cascade, тем самым не удалит при изменении зависимые объекты

Минусы:

  • Сложнее поддерживать

incremental стратегия

Incremental strategy определяет, как таблица будет обновляться.

Datapulse поддерживает два типа обновления для таблиц incremental:

  • append - только вставка данных
  • delete+insert - удаление изменившихся данных (по ключу) и вставка новых данных

Захват инкремента

Модели типа incremental не будут столь эффективны, если при обновлении модели каждый раз брать данные из источника целиком (full scan). Более того, если у модели типа incremental выбрана стратегия append, то при каждом запуске в целевую таблицу будут записываться все строки из таблицы источника, а старые строки в целевой таблице не будут удаляться.

Чтобы полностью использовать преимущества моделей типа incremental требуется в SQL-запросе указать захват только новых/изменившихся строк на источнике.

select * from some_source_table
{% if is_incremental() %}
    where start_date > (select coalesce(max(start_date),'1900-01-01') from {{ this }} )
{% endif %}
В этом примере, если модель запускается не первый раз ({% if is_incremental() %}) в таблице some_source_table будут прочитаны только те строки, у которых start_date больше максимального значения столбца start_date в some_source_table. {{ this }} указывает на текущую модель.

ephemeral

В DWH не создается никакого объекта. Модель типа ephemeral виртуальная и существует только в рамках вашего dbt проекта. Ее можно вызывать в других моделях, тем самым переиспользуя логику.