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

freshness

dbt_project.yml
sources:
<resource-path>:
+freshness:
warn_after:
count: <positive_integer>
period: minute | hour | day

Определение

Блок свежести используется для определения допустимого времени между самой последней записью и текущим моментом, чтобы table считалась "свежей".

В блоке freshness можно указать один или оба параметра warn_after и error_after. Если ни один из них не указан, dbt не будет рассчитывать снимки свежести для таблиц в этом источнике.

В большинстве случаев параметр loaded_at_field является обязательным. Некоторые адаптеры поддерживают вычисление свежести источника на основе таблиц метаданных хранилища данных и могут обходиться без loaded_at_field.

Если у источника определён блок freshness:, dbt попытается вычислить свежесть для этого источника:

  • Если указан loaded_at_field, dbt вычислит свежесть с помощью select-запроса.
  • Если loaded_at_field не указан, dbt будет вычислять свежесть через таблицы метаданных хранилища данных, когда это возможно.

В настоящее время расчет свежести на основе метаданных таблиц хранилища поддерживается для следующих адаптеров:

Блоки freshness применяются иерархически:

  • Свойства freshness и loaded_at_field, добавленные к источнику (source), будут применяться ко всем таблицам, определённым в этом источнике.
  • Свойства freshness и loaded_at_field, добавленные к таблице источника (source table), переопределяют любые свойства, заданные на уровне источника.

Это полезно, когда все таблицы в источнике имеют одно и то же значение loaded_at_field, что часто бывает.

Чтобы исключить источник из расчётов свежести, явно укажите freshness: null.

В state-aware orchestration dbt по умолчанию использует метаданные хранилища данных, чтобы проверять, являются ли источники (или вышестоящие модели в случае Mesh) свежими. Подробнее о том, как свежесть используется в state-aware orchestration, см. раздел Advanced configurations.

loaded_at_field

Необязателен для адаптеров, которые поддерживают получение свежести из метаданных таблиц хранилища, в противном случае требуется.

Имя столбца (или выражение), которое возвращает временную метку, указывающую на свежесть.

Если используется поле даты, возможно, вам придется привести его к типу timestamp:

loaded_at_field: "completed_date::timestamp"

Или, в зависимости от вашего варианта SQL:

loaded_at_field: "CAST(completed_date AS TIMESTAMP)"

Если используется временная метка, не относящаяся к UTC, сначала приведите ее к UTC:

loaded_at_field: "convert_timezone('Australia/Sydney', 'UTC', created_at_local)"

count

(Обязательный)

Положительное целое число, указывающее количество периодов, в течение которых источник данных все еще считается "свежим".

period

(Обязательный)

Период времени, используемый в расчете свежести. Один из minute, hour или day.

filter

(необязательный)

Добавьте условие where к запросу, выполняемому dbt source freshness, чтобы ограничить объем обрабатываемых данных.

Этот фильтр применяется только к запросам свежести источника dbt - он не повлияет на другие использования таблицы источника.

Это особенно полезно, если:

  • Вы используете BigQuery, и ваши таблицы источников являются разделенными таблицами.
  • Вы используете Snowflake, Databricks или Spark с большими таблицами, и это приводит к улучшению производительности.

Примеры

Полный пример

models/<filename>.yml


sources:
- name: jaffle_shop
database: raw
config:
# changed to config in v1.9
freshness: # default freshness
warn_after: {count: 12, period: hour}
error_after: {count: 24, period: hour}

loaded_at_field: _etl_loaded_at

tables:
- name: customers # это будет использовать свежесть, определенную выше

- name: orders
config:
freshness: # сделаем требования немного строже
warn_after: {count: 6, period: hour}
error_after: {count: 12, period: hour}
# Применить условие where в запросе для проверки свежести данных

- name: product_skus
config:
freshness: # не проверять свежесть для этой таблицы

При выполнении dbt source freshness будет выполнен следующий запрос:

select
max(_etl_loaded_at) as max_loaded_at,
convert_timezone('UTC', current_timestamp()) as snapshotted_at
from raw.jaffle_shop.orders

where datediff('day', _etl_loaded_at, current_timestamp) < 2

Нашли ошибку?

0
Loading