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

Определение конфигураций

Узнайте, как определять конфигурации для ваших ресурсов в dbt‑проекте

В зависимости от типа ресурса вы можете задавать конфигурации в dbt‑проекте, а также в установленном пакете, следующими способами:

(Версии dbt: v1.9 и новее)
  1. Используя свойство config в файле .yml для поддерживаемых директорий ресурсов, таких как models/, snapshots/, seeds/, analyses, tests/ и других.
  2. Через файл 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:

models/jaffle_shop.yml
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

Полный список всех поддерживаемых свойств и конфигураций, разбитый по типам ресурсов, можно найти здесь:

Часто задаваемые вопросы (FAQ)​

Нужно ли называть мой файл `.yml`, содержащий тесты и описания, `schema.yml`?
Если я могу называть эти файлы как угодно, как мне их назвать?
Следует ли использовать отдельные файлы для объявления свойств ресурсов или один большой файл?
Можно ли добавлять тесты и описания в SQL config-блоке?
Почему файлы YAML для моделей и источников всегда начинаются с `version: 2`?
Могу ли я использовать расширение файла YAML?

Устранение распространённых ошибок​

 Некорректная конфигурация теста в модели

Эта ошибка возникает, когда ваш файл .yml не соответствует структуре, ожидаемой dbt. Полное сообщение об ошибке может выглядеть так:

* Invalid test config given in models/schema.yml near {'namee': 'event', ...}
Invalid arguments passed to "UnparsedNodeUpdate" instance: 'name' is a required property, Additional properties are not allowed ('namee' was unexpected)

Хотя сообщение достаточно подробное, оно должно помочь определить источник проблемы. В данном случае поле name было по ошибке указано как namee. Чтобы исправить эту ошибку, убедитесь, что ваш .yml файл соответствует ожидаемой структуре, описанной в этом руководстве.

 Некорректный синтаксис файла schema.yml

Если ваш файл .yml не является корректным YAML, dbt покажет ошибку вида:

Runtime Error
Syntax error near line 6
------------------------------
5 | - name: events
6 | description; "A table containing clickstream events from the marketing website"
7 |

Raw Error:
------------------------------
while scanning a simple key
in "<unicode string>", line 6, column 5:
description; "A table containing clickstream events from the marketing website"
^

Эта ошибка произошла из-за того, что после поля description по ошибке была использована точка с запятой (;) вместо двоеточия (:). Чтобы устранить подобные проблемы, найдите файл .yml, указанный в сообщении об ошибке, и исправьте все синтаксические ошибки в этом файле. В этом могут помочь онлайн-валидаторы YAML, однако будьте осторожны и не отправляйте конфиденциальную информацию в сторонние сервисы!

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

0
Loading