Определение конфигураций
В зависимости от типа ресурса вы можете задавать конфигурации в dbt‑проекте, а также в установленном пакете, следующими способами:
(Версии dbt: v1.9 и новее)- Используя свойство
configв файле.ymlдля поддерживаемых директорий ресурсов, таких какmodels/,snapshots/,seeds/,analyses,tests/и других. - Через файл
dbt_project.yml, в соответствующем ключе ресурса (models:,snapshots:,data_tests:и так далее).
Наследование конфигураций
Наиболее специфичная конфигурация всегда имеет приоритет. В общем случае это следует порядку, указанному выше: блок config() внутри файла → свойства, определённые в .yml файле → конфигурация, заданная в проектном файле.
Примечание: обобщённые data tests работают немного иначе с точки зрения специфичности. Подробнее см. test configs.
Внутри проектного файла конфигурации также применяются иерархически. Наиболее специфичная конфигурация всегда имеет приоритет. Например, конфигурации, применённые к поддиректории marketing, будут иметь приоритет над конфигурациями, применёнными ко всему проекту jaffle_shop. Чтобы применить конфигурацию к модели или директории моделей, определите resource path в виде вложенных ключей словаря.
Конфигурации в корневом dbt‑проекте имеют более высокий приоритет, чем конфигурации в установленных пакетах. Это позволяет переопределять настройки установленных пакетов и даёт больше контроля над выполнением dbt.
Комбинирование конфигураций
Большинство конфигураций «перезаписываются» при применении по иерархии. Если доступно более конкретное значение, оно полностью заменяет менее конкретное. Обратите внимание, что некоторые конфигурации объединяются иначе:
-
tagsсуммируются. Если для модели настроены теги вdbt_project.yml, а в её файле.sqlзаданы дополнительные теги, итоговый набор будет включать их все. -
При использовании конфигурации
freshnessболее конкретная пара «ключ — значение» заменяет менее конкретное значение с тем же ключом. -
pre-hookиpost-hookтакже суммируются. -
Словари
metaобъединяются поверхностно: dbt объединяет только ключи верхнего уровня и не заглядывает во вложенные словари. Если один и тот же ключ верхнего уровня встречается на нескольких уровнях, более конкретное значение полностью заменяет менее конкретное — даже если это значение само является словарём. Ключи верхнего уровня, встречающиеся только на одном уровне, сохраняются. Например, если вdbt_project.ymlзадано:+meta: {owner: "alice", dagster: {automation_condition: "eager"}}а в модели задано:
meta: {dagster: {asset_key: "my_key"}}результат будет следующим:
{owner: "alice", dagster: {asset_key: "my_key"}}ownerсохраняется, поскольку встречается только на одном уровне.dagsterвстречается на обоих уровнях, поэтому более конкретное значение заменяет его целиком — а поскольку при объединении содержимоеdagsterне рассматривается, вложенный ключautomation_conditionтеряется. При глубоком (рекурсивном) объединении вложенные ключи, напротив, объединились бы, дав результатdagster: {automation_condition: "eager", asset_key: "my_key"}. Вmetaэтого не происходит — вложенные словари заменяются, а не объединяются.
Какая конфигурация имеет приоритет на разных уровнях
Для перезаписи и объединения конфигураций, наследуемых с нескольких уровней, действуют следующие общие правила:
- Конфигурации на уровне узла (более конкретные) перезаписывают конфигурации на уровне проекта (менее конкретные).
- Для источников конфигурации на уровне таблицы (более конкретные) перезаписывают конфигурации на уровне источника (менее конкретные).
- Конфигурация корневого проекта в
dbt_project.ymlперезаписывает конфигурацию в файлах пакетов. Это позволяет пользователям управлять поведением пакетов, устанавливаемых с помощьюdbt deps, без необходимости напрямую редактировать код в файлах этих пакетов.
Префикс +
dbt различает имя папки и конфигурацию, используя префикс + перед именем конфигурации. Префикс + используется только для конфигураций и применяется в файле dbt_project.yml в рамках соответствующего ключа ресурса. Он не применяется к:
- вызову макроса Jinja
config()в файле ресурса - свойству
configв файле.yml.
Дополнительную информацию см. в разделе Использование префикса +.
Пример
Ниже приведён пример, в котором для проекта определены и sources, и models:
version: 2
sources:
- name: raw_jaffle_shop
description: A replica of the postgres database used to power the jaffle_shop app.
tables:
- name: customers
columns:
- name: id
description: Primary key of the table
data_tests:
- unique
- not_null
- name: orders
columns:
- name: id
description: Primary key of the table
data_tests:
- unique
- not_null
- name: user_id
description: Foreign key to customers
- name: status
data_tests:
- accepted_values:
arguments: # available in v1.10.5 and higher. Older versions can set the <argument_name> as the top-level property.
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
models:
- name: stg_jaffle_shop__customers # Must match the filename of a model -- including case sensitivity.
config:
tags: ['pii']
columns:
- name: customer_id
data_tests:
- unique
- not_null
- name: stg_jaffle_shop__orders
config:
materialized: view
columns:
- name: order_id
data_tests:
- unique
- not_null
- name: status
data_tests:
- accepted_values:
arguments: # available in v1.10.5 and higher. Older versions can set the <argument_name> as the top-level property.
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
config:
severity: warn
Связанная документация
Полный список всех поддерживаемых свойств и конфигураций, разбитый по типам ресурсов, можно найти здесь:
- Модели: properties и configs
- Источники: properties и configs
- Seed-данные: properties и configs
- Снимки (snapshots): properties
- Анализы: properties
- Макросы: properties
- Экспозиции (exposures): properties