freshness
- Project file
- Model YAML
sources:
<resource-path>:
+freshness:
warn_after:
count: <positive_integer>
period: minute | hour | day
sources:
- name: <source_name>
config:
freshness: # changed to config in v1.9
warn_after:
count: <positive_integer>
period: minute | hour | day
error_after:
count: <positive_integer>
period: minute | hour | day
filter: <boolean_sql_expression>
# changed to config in v1.10
loaded_at_field: <column_name_or_expression>
# or use loaded_at_query in v1.10 or higher. Should not be used if loaded_at_field is defined
loaded_at_query: <sql_expression>
tables:
- name: <table_name>
config:
# source.table.config.freshness overrides source.config.freshness
freshness:
warn_after:
count: <positive_integer>
period: minute | hour | day
error_after:
count: <positive_integer>
period: minute | hour | day
filter: <boolean_sql_expression>
# changed to config in v1.10
loaded_at_field: <column_name_or_expression>
# or use loaded_at_query in v1.10 or higher. Should not be used if loaded_at_field is defined
loaded_at_query: <sql_expression>
...
Определение
Блок свежести используется для определения допустимого времени между самой последней записью и текущим моментом, чтобы table считалась "свежей".
В блоке freshness можно указать один или оба параметра warn_after и error_after. Если ни один из них не указан, dbt не будет рассчитывать снимки свежести для таблиц в этом источнике.
В большинстве случаев параметр loaded_at_field является обязательным. Некоторые адаптеры поддерживают вычисление свежести источника на основе таблиц метаданных хранилища данных и могут обходиться без loaded_at_field.
Если у источника определён блок freshness:, dbt попытается вычислить свежесть для этого источника:
- Если указан
loaded_at_field, dbt вычислит свежесть с помощью select-запроса. - Если
loaded_at_fieldне указан, dbt будет вычислять свежесть через таблицы метаданных хранилища данных, когда это возможно.
В настоящее время расчет свежести на основе метаданных таблиц хранилища поддерживается для следующих адаптеров:
- Snowflake
- Redshift
- BigQuery (поддерживается в версии
dbt-bigquery1.7.3 или выше) - Databricks (поддерживается в dbt Fusion Engine)
Блоки 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 с большими таблицами, и это приводит к улучшению производительности.
Примеры
Полный пример
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 будет выполнен следующий запрос:
- Скомпилированный SQL
- Jinja SQL
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
select
max({{ loaded_at_field }}) as max_loaded_at,
{{ current_timestamp() }} as snapshotted_at
from {{ source }}
{% if filter %}
where {{ filter }}
{% endif %}