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

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.

models/_models.yml
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
За кулисами alias заменяется объектом, определённым в anchor.За кулисами alias заменяется объектом, определённым в anchor.

Синтаксис merge​

Иногда anchor в основном подходит, но одну его часть нужно переопределить. Если anchor ссылается на словарь / mapping (а не на список и не на scalar value), вы можете использовать синтаксис merge <<: для переопределения уже определённого ключа или добавления новых ключей в словарь. Например:

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

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

0
Loading