Перейти к основному содержимому

Добавление снимков в ваш DAG

Связанная документация

Что такое снимки?

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

Снимки реализуют тип-2 медленно изменяющихся измерений в изменяемых исходных таблицах. Эти медленно изменяющиеся измерения (или SCD) определяют, как строка в таблице изменяется с течением времени. Представьте, что у вас есть таблица orders, где поле status может быть перезаписано по мере обработки заказа.

idstatusupdated_at
1pending2024-01-01

Теперь представьте, что заказ переходит из состояния "pending" в "shipped". Эта же запись теперь будет выглядеть так:

idstatusupdated_at
1shipped2024-01-02

Этот заказ теперь в состоянии "shipped", но мы потеряли информацию о том, когда заказ в последний раз находился в состоянии "pending". Это затрудняет (или делает невозможным) анализ того, сколько времени потребовалось для отправки заказа. dbt может "сделать снимок" этих изменений, чтобы помочь вам понять, как значения в строке изменяются с течением времени. Вот пример таблицы снимков для предыдущего примера:

idstatusupdated_atdbt_valid_fromdbt_valid_to
1pending2024-01-012024-01-012024-01-02
1shipped2024-01-022024-01-02null

Конфигурирование снимков

Лучшие практики конфигурации

 Используйте стратегию timestamp, где это возможно
 Используйте dbt_valid_to_current для упрощения запросов по диапазону дат
 Убедитесь, что ваш уникальный ключ действительно уникален

Как работают снимки

Когда вы запускаете команду dbt snapshot:

  • При первом запуске: dbt создаст начальную таблицу снимков — это будет результирующий набор вашего select запроса с дополнительными колонками, включая dbt_valid_from и dbt_valid_to. Все записи будут иметь dbt_valid_to = null или значение, указанное в dbt_valid_to_current (доступно в dbt Core 1.9+), если настроено.
  • При последующих запусках: dbt проверит, какие записи изменились или были созданы новые записи:
    • Колонка dbt_valid_to будет обновлена для всех существующих записей, которые изменились.
    • Обновленная запись и любые новые записи будут вставлены в таблицу снимков. Эти записи теперь будут иметь dbt_valid_to = null или значение, настроенное в dbt_valid_to_current (доступно в dbt Core v1.9+).

Снимки могут быть использованы в последующих моделях так же, как и модели — с помощью функции ref.

Обнаружение изменений строк

Стратегии снимков определяют, как dbt узнает, изменилась ли строка. В dbt встроены две стратегии:

  • Timestamp — Использует колонку updated_at, чтобы определить, изменилась ли строка.
  • Check — Сравнивает список колонок между их текущими и историческими значениями, чтобы определить, изменилась ли строка.

Стратегия Timestamp (рекомендуется)

Стратегия timestamp использует поле updated_at, чтобы определить, изменилась ли строка. Если настроенная колонка updated_at для строки более новая, чем в последний раз, когда снимок запускался, то dbt аннулирует старую запись и запишет новую. Если временные метки не изменились, то dbt не предпримет никаких действий.

Стратегия timestamp требует следующих конфигураций:

КонфигурацияОписаниеПример
updated_atКолонка, которая представляет, когда исходная строка была в последний раз обновленаupdated_at

Пример использования:

Стратегия Check

Стратегия check полезна для таблиц, которые не имеют надежной колонки updated_at. Эта стратегия работает, сравнивая список колонок между их текущими и историческими значениями. Если какая-либо из этих колонок изменилась, то dbt аннулирует старую запись и запишет новую. Если значения колонок идентичны, то dbt не предпримет никаких действий.

Стратегия check требует следующих конфигураций:

КонфигурацияОписаниеПример
check_colsСписок колонок для проверки изменений или all для проверки всех колонок["name", "email"]
check_cols = 'all'

Стратегия снимков check может быть настроена для отслеживания изменений всех колонок, указав check_cols = 'all'. Лучше явно перечислить колонки, которые вы хотите проверить. Рассмотрите возможность использования для конденсации многих колонок в одну.

Пример использования

Жесткие удаления (опционально)

Мета-поля снимков

Снимки таблицы будут созданы как клон вашего исходного набора данных, плюс некоторые дополнительные мета-поля*.

В dbt Core v1.9+ (или доступно раньше в релизном треке "Latest" в dbt Cloud):

  • Эти имена колонок могут быть настроены в соответствии с вашими командными или организационными соглашениями, используя конфигурацию snapshot_meta_column_names.
  • Используйте конфигурацию dbt_valid_to_current, чтобы установить пользовательский индикатор для значения dbt_valid_to в текущих записях снимков (например, будущая дата, такая как 9999-12-31). По умолчанию это значение NULL. Когда установлено, dbt будет использовать это указанное значение вместо NULL для dbt_valid_to для текущих записей в таблице снимков.
  • Используйте конфигурацию hard_deletes, чтобы отслеживать удаленные записи как новые строки с мета-полем dbt_is_deleted, когда используется поле hard_deletes='new_record'.
ПолеЗначениеИспользование
dbt_valid_fromВременная метка, когда эта строка снимка была впервые вставленаЭта колонка может быть использована для упорядочивания различных "версий" записи.
dbt_valid_toВременная метка, когда эта строка стала недействительной.
Для текущих записей это NULL по умолчанию
Самая последняя запись снимка будет иметь dbt_valid_to, установленное в NULL
dbt_scd_idУникальный ключ, сгенерированный для каждой записи снимка.Это используется внутренне dbt
dbt_updated_atВременная метка updated_at исходной записи, когда эта строка снимка была вставлена.Это используется внутренне dbt
dbt_is_deletedЛогическое значение, указывающее, была ли запись удалена. True, если удалена, False в противном случае.Добавляется, когда настроено hard_deletes='new_record'. Это используется внутренне dbt

*Временные метки, используемые для каждой колонки, немного различаются в зависимости от используемой стратегии:

Для стратегии timestamp настроенная колонка updated_at используется для заполнения колонок dbt_valid_from, dbt_valid_to и dbt_updated_at.

Подробности для стратегии timestamp

Результаты запроса снимка на 2024-01-01 11:00

idstatusupdated_at
1pending2024-01-01 10:47

Результаты снимка (обратите внимание, что 11:00 нигде не используется):

idstatusupdated_atdbt_valid_fromdbt_valid_todbt_updated_at
1pending2024-01-01 10:472024-01-01 10:472024-01-01 10:47

Результаты запроса на 2024-01-01 11:30:

idstatusupdated_at
1shipped2024-01-01 11:05

Результаты снимка (обратите внимание, что 11:30 нигде не используется):

idstatusupdated_atdbt_valid_fromdbt_valid_todbt_updated_at
1pending2024-01-01 10:472024-01-01 10:472024-01-01 11:052024-01-01 10:47
1shipped2024-01-01 11:052024-01-01 11:052024-01-01 11:05

Результаты снимка с hard_deletes='new_record':

idstatusupdated_atdbt_valid_fromdbt_valid_todbt_updated_atdbt_is_deleted
1pending2024-01-01 10:472024-01-01 10:472024-01-01 11:052024-01-01 10:47False
1shipped2024-01-01 11:052024-01-01 11:052024-01-01 11:202024-01-01 11:05False
1deleted2024-01-01 11:202024-01-01 11:202024-01-01 11:20True

Для стратегии check используется текущая временная метка для заполнения каждой колонки. Если настроено, стратегия check использует колонку updated_at вместо этого, как и в стратегии timestamp.

Подробности для стратегии check

Результаты запроса снимка на 2024-01-01 11:00

idstatus
1pending

Результаты снимка:

idstatusdbt_valid_fromdbt_valid_todbt_updated_at
1pending2024-01-01 11:002024-01-01 11:00

Результаты запроса на 2024-01-01 11:30:

idstatus
1shipped

Результаты снимка:

idstatusdbt_valid_fromdbt_valid_todbt_updated_at
1pending2024-01-01 11:002024-01-01 11:302024-01-01 11:00
1shipped2024-01-01 11:302024-01-01 11:30

Результаты снимка с hard_deletes='new_record':

idstatusdbt_valid_fromdbt_valid_todbt_updated_atdbt_is_deleted
1pending2024-01-01 11:002024-01-01 11:302024-01-01 11:00False
1shipped2024-01-01 11:302024-01-01 11:402024-01-01 11:30False
1deleted2024-01-01 11:402024-01-01 11:40True

Настройка снимков в версиях 1.8 и ранее

Часто задаваемые вопросы

Как запустить один снимок за раз?
Как часто следует запускать команду snapshot?
Что произойдет, если я добавлю новые столбцы в запрос снимка?
Выполняются ли хуки со снапшотами?
Могу ли я хранить свои снимки в каталоге, отличном от каталога `snapshot` в моем проекте?
Ошибка: Целевая таблица снимка не является таблицей снимков
0