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

YAML Селекторы

Пишите селекторы ресурсов в YAML, сохраняйте их с удобочитаемым именем и используйте их с помощью флага --selector. Записывая селекторы в файл верхнего уровня selectors.yml:

  • Читаемость: сложные критерии выбора составляются из словарей и массивов
  • Контроль версий: определения селекторов хранятся в том же git-репозитории, что и проект dbt
  • Повторное использование: селекторы могут использоваться в нескольких определениях задач, и их определения могут быть расширены (с помощью якорей YAML)

Селекторы находятся в файле верхнего уровня с именем selectors.yml. Каждый должен иметь name и definition, и может дополнительно определять description и default флаг.

selectors.yml
selectors:
- name: nodes_to_joy
definition: ...
- name: nodes_to_a_grecian_urn
description: Аттическая форма с хорошим настроением
default: true
definition: ...

Определения

Каждое definition состоит из одного или нескольких аргументов, которые могут быть следующими:

  • CLI-стиль: строки, представляющие аргументы в стиле CLI
  • Ключ-значение: пары в форме method: value
  • Полный YAML: полностью определенные словари с элементами для method, value, эквивалентными операторами и поддержкой exclude

Используйте эквивалентные операторам ключевые слова union и intersection для организации нескольких аргументов.

CLI-стиль

definition:
'tag:nightly'

Этот простой синтаксис поддерживает использование операторов +, @ и * граф, но не поддерживает множество операторов или exclude.

Ключ-значение

definition:
tag: nightly

Этот простой синтаксис не поддерживает никаких граф или множество операторов или exclude.

Полный YAML

Это самый подробный синтаксис, который может включать эквивалентные операторам ключевые слова для граф и множество операторов.

Просмотрите методы для доступного списка.

definition:
method: tag
value: nightly

# Необязательные ключевые слова соответствуют операторам `+` и `@` графа:

children: true | false
parents: true | false

children_depth: 1 # если children: true, количество уровней для включения
parents_depth: 1 # если parents: true, количество уровней для включения

childrens_parents: true | false # оператор @

indirect_selection: eager | cautious | buildable | empty # включать все тесты, выбранные косвенно? по умолчанию eager

Оператор * для выбора всех узлов можно записать как:

definition:
method: fqn
value: "*"

Исключение

Ключевое слово exclude поддерживается только полностью квалифицированными словарями. Оно может быть передано как аргумент к каждому словарю или как элемент в union. Следующие примеры эквивалентны:

- method: tag
value: nightly
exclude:
- "@tag:daily"
- union:
- method: tag
value: nightly
- exclude:
- method: tag
value: daily

Примечание: Аргумент exclude в YAML селекторах немного отличается от аргумента --exclude в CLI. Здесь exclude всегда возвращает разность множеств, и он всегда применяется последним в своей области.

Когда передается более одного "yeslist" (--select), они рассматриваются как объединение, а не как пересечение. То же самое происходит, когда есть более одного "nolist" (--exclude).

Косвенный выбор

Как общее правило, dbt будет косвенно выбирать все тесты, если они касаются любого ресурса, который вы выбираете напрямую. Мы называем это "жадным" косвенным выбором. Вы можете переключить режим косвенного выбора на "осторожный", "строимый" или "пустой", установив indirect_selection для конкретного критерия:

- union:
- method: fqn
value: model_a
indirect_selection: eager # по умолчанию: будут включены все тесты, касающиеся model_a
- method: fqn
value: model_b
indirect_selection: cautious # не будут включены тесты, касающиеся model_b
# если у них есть другие невыбранные родители
- method: fqn
value: model_c
indirect_selection: buildable # не будут включены тесты, касающиеся model_c
# если у них есть другие невыбранные родители (если только у них нет предка, который выбран)
- method: fqn
value: model_d
indirect_selection: empty # будут включены тесты только для выбранного узла и игнорированы все тесты, прикрепленные к model_d

Если указано, значение indirect_selection YAML селектора будет иметь приоритет над флагом CLI --indirect-selection. Поскольку indirect_selection определяется отдельно для каждого критерия выбора, возможно смешивать режимы eager/cautious/buildable/empty в одном определении, чтобы достичь нужного поведения. Помните, что вы всегда можете протестировать свои критерии с помощью dbt ls --selector.

Смотрите примеры выбора тестов для более подробной информации о косвенном выборе.

Пример

Вот два способа представления:

$ dbt run --select @source:snowplow,tag:nightly models/export --exclude package:snowplow,config.materialized:incremental export_performance_timing
selectors.yml

selectors:
- name: nightly_diet_snowplow
description: "Неинкрементальные модели Snowplow, которые обеспечивают ночные экспорты"
definition:

# Необязательные ключевые слова `union` и `intersection` соответствуют операторам ` ` и `,` множества:
union:
- intersection:
- '@source:snowplow'
- 'tag:nightly'
- 'models/export'
- exclude:
- intersection:
- 'package:snowplow'
- 'config.materialized:incremental'
- export_performance_timing

Затем в определении нашей задачи:

dbt run --selector nightly_diet_snowplow

По умолчанию

Селекторы могут определять булевое свойство default. Если у селектора default: true, dbt будет использовать критерии этого селектора, когда задачи не определяют свои собственные критерии выбора.

Предположим, мы определяем селектор по умолчанию, который выбирает только ресурсы, определенные в нашем корневом проекте:

selectors:
- name: root_project_only
description: >
Только ресурсы из корневого проекта.
Исключает ресурсы, определенные в установленных пакетах.
default: true
definition:
method: package
value: <my_root_project_name>

Если я запускаю "неквалифицированную" команду, dbt будет использовать критерии выбора, определенные в root_project_only — то есть, dbt будет только строить / проверять свежесть / генерировать скомпилированный SQL для ресурсов, определенных в моем корневом проекте.

dbt build
dbt source freshness
dbt docs generate

Если я запускаю команду, которая определяет свои собственные критерии выбора (через --select, --exclude или --selector), dbt проигнорирует селектор по умолчанию и использует критерии флага вместо этого. Он не будет пытаться комбинировать их.

dbt run --select  "model_a"
dbt run --exclude model_a

Только один селектор может установить default: true для данного вызова; в противном случае dbt вернет ошибку. Вы можете использовать выражение Jinja, чтобы настроить значение default в зависимости от среды:

selectors:
- name: default_for_dev
default: "{{ target.name == 'dev' | as_bool }}"
definition: ...
- name: default_for_prod
default: "{{ target.name == 'prod' | as_bool }}"
definition: ...

Наследование селекторов

Селекторы могут повторно использовать и расширять определения из других селекторов с помощью метода selector.

selectors:
- name: foo_and_bar
definition:
intersection:
- tag: foo
- tag: bar

- name: foo_bar_less_buzz
definition:
intersection:
# повторное использование определения из выше
- method: selector
value: foo_and_bar
# с модификацией!
- exclude:
- method: tag
value: buzz

Примечание: Хотя наследование селекторов позволяет повторно использовать логику из другого селектора, оно не позволяет модифицировать логику этого селектора с помощью parents, children, indirect_selection и так далее.

Метод selector возвращает полный набор узлов, возвращаемых именованным селектором.

0