anchors
Определение
Якоря — это возможность YAML, которая позволяет повторно использовать блоки конфигурации в пределах одного YAML-файла. В dbt v1.10 появился ключ anchors:, предназначенный для размещения фрагментов конфигурации, которые сами по себе не являются допустимыми или существуют только как данные для шаблонов. Использование ключа anchors: гарантирует, что эти фрагменты не будут отклонены при проверке файла.
В dbt v1.10 и более поздних версиях недопустимые якоря вызывают предупреждение. В dbt v2 такие недопустимые якоря приводят к ошибкам.
Вы можете определять якоря в dbt v1.9 и более ранних версиях, но в этих версиях для якорей нет специально выделенного места. Если вам нужно определить отдельный якорь, вы можете разместить его на верхнем уровне YAML-файла.
Синтаксис YAML anchors
Якоря и алиасы
Чтобы определить YAML anchor, добавьте блок anchors: в ваш YAML-файл и используйте символ & перед именем anchor (например, &id_column_alias). Это создаёт alias, на который можно ссылаться в других местах, добавляя символ * перед именем alias.
В следующем примере создаётся anchor, alias которого — *id_column_alias. Колонка id, её описание, тип данных и data tests применяются к моделям my_first_model, my_second_model и my_third_model.
anchors:
- &id_column_alias
name: id
description: This is a unique identifier.
data_type: int
data_tests:
- not_null
- unique
models:
- name: my_first_model
columns:
- *id_column_alias
- name: unrelated_column_a
description: This column is not repeated in other models.
- name: unrelated_column_b
- name: my_second_model
columns:
- *id_column_alias
- name: unrelated_column_c
- name: my_third_model
columns:
- *id_column_alias
- name: unrelated_column_d
Синтаксис merge
Иногда anchor в основном подходит, но одну его часть нужно переопределить. Если anchor ссылается на словарь / mapping (а не на список и не на scalar value), вы можете использовать синтаксис merge <<: для переопределения уже определённого ключа или добавления новых ключей в словарь. Например:
anchors:
- &id_column_alias
name: id
description: This is a unique identifier.
data_type: int
data_tests:
- not_null
- unique
- &source_template_alias
database: RAW
loader: fivetran
config:
freshness:
warn_after: {count: 1, period: day}
models:
- name: my_first_model
columns:
- *id_column_alias # подтягивает весь anchor, определённый выше
- name: unrelated_column_a
description: This column is not repeated in other models.
- name: unrelated_column_b
- name: my_second_model
columns:
- <<: *id_column_alias
data_type: bigint # переопределяет data_type с int на bigint, при этом наследуя name, description и data tests
- name: unrelated_column_c
- name: my_third_model
columns:
- <<: *id_column_alias
config:
meta:
extra_key: extra_value # добавляет config.meta.extra_key только для этой версии колонки id, помимо name, description, data type и data tests
- name: unrelated_column_d
sources:
# оба source начинаются с database, loader и ожиданий freshness, заданных через anchor, и дополняются остальными ключами
- <<: *source_template_alias
name: salesforce
schema: etl_salesforce_schema
tables:
- name: opportunities
- name: users
- <<: *source_template_alias
name: hubspot
schema: etl_hubspot_schema
tables:
- name: contacts
Примечания по использованию
-
В старых версиях dbt (v1.9 и более ранних) нет отдельного ключа
anchors:. Если вам нужно определить самостоятельный якорь, его можно оставить на верхнем уровне файла. -
Нельзя добавлять дополнительные элементы в список, определённый как якорь. Например, если вы определили якорь, содержащий несколько столбцов, вы не сможете добавить дополнительные столбцы в конец этого списка. Вместо этого определите каждый столбец как отдельный якорь и добавьте каждый из них в соответствующие таблицы.
-
Не нужно переносить существующие якоря в ключ
anchors:, если они уже определены внутри более крупного корректного объекта YAML. Например, следующий якорь&customer_id_testsне нужно переносить, поскольку он является допустимой частью существующего блокаcolumns.models:
- name: my_first_model
columns:
- name: customer_id
data_tests: &customer_id_tests
- not_null
- unique
- name: order_id
data_tests: *customer_id_tests
