Обновление до v1.10
Ресурсы
Что нужно знать перед обновлением
dbt Labs стремится обеспечивать обратную совместимость для всех версий 1.x. Любые изменения в поведении будут сопровождаться флагом изменения поведения, который предоставляет окно для миграции существующих проектов. Если после обновления вы столкнулись с ошибкой, пожалуйста, сообщите нам, открыв issue.
Начиная с 2024 года, dbt предоставляет функциональность новых версий dbt Core через release tracks с автоматическими обновлениями. Если в dbt у вас выбран release track Latest, у вас уже есть доступ ко всем возможностям, исправлениям и прочему функционалу, включённому в dbt Core v1.10! Если выбран release track Compatible, доступ появится в следующем ежемесячном выпуске Compatible после финального релиза dbt Core v1.10.
Для пользователей dbt Core, начиная с v1.8, мы рекомендуем явно устанавливать как dbt-core, так и dbt-<youradapter>. В будущих версиях dbt это может стать обязательным требованием. Например:
python3 -m pip install dbt-core dbt-snowflake
Новые и измененные возможности и функциональность
Новые возможности и изменения, доступные в dbt Core v1.10
Флаг --sample
Большие наборы данных могут существенно замедлять время выполнения сборок dbt, усложняя эффективное тестирование нового кода. Флаг --sample, доступный для команд run и build, помогает сократить время сборки и затраты на хранилище данных, запуская dbt в режиме выборки. Он генерирует отфильтрованные refs и sources с использованием временной выборки, позволяя разработчикам проверять результаты без построения моделей целиком.
Перемещение независимых якорей под ключ anchors:
В рамках продолжающейся работы по повышению точности языка описания dbt, dbt Core v1.10 выводит предупреждение при обнаружении неожиданного ключа верхнего уровня в properties YAML-файле. Распространённый сценарий появления таких ключей — это отдельные определения anchors на верхнем уровне YAML-файла свойств. Для таких повторно используемых блоков конфигурации теперь можно использовать новый ключ верхнего уровня anchors:.
Например, вместо следующей конфигурации:
id_column: &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: my_second_model
columns:
- *id_column_alias
Следует переместить anchor под ключ anchors::
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: my_second_model
columns:
- *id_column_alias
Это перемещение необходимо только для фрагментов, определённых вне основной структуры YAML. Подробнее о новом ключе см. в разделе anchors.
Парсинг catalogs.yml
dbt Core теперь умеет парсить файл catalogs.yml. Это важная веха на пути к поддержке внешних каталогов для таблиц Iceberg, так как она позволяет реализовывать write-интеграции. Теперь можно задать конфигурацию, указывающую интеграцию каталога для producer-модели:
Например:
catalogs:
- name: catalog_dave
# materializing the data to an external location, and metadata to that data catalog
write_integrations:
- name: databricks_glue_write_integration
external_volume: databricks_external_volume_prod
table_format: iceberg
catalog_type: unity
Реализация на стороне модели будет выглядеть так:
models:
- name: my_second_public_model
config:
catalog_name: catalog_dave
Уже сейчас ознакомьтесь с нашей документацией по поддержке внешних каталогов! В ближайшие недели мы поделимся дополнительной информацией, но уже сейчас это важный шаг на пути к кросс-платформенной поддержке.
Интеграция артефактов dbt Core с dbt‑проектами
С использованием гибридных проектов пользователи dbt Core при работе в командной строке (CLI) могут выполнять запуски, которые автоматически загружают артефакты в dbt. Это расширяет возможности гибридных развёртываний dbt Core / dbt за счёт:
- Улучшения совместной работы между пользователями dbt и dbt Core за счёт возможности визуализации и использования cross-project references к моделям, определённым в проектах dbt Core. Эта функция объединяет рабочие процессы dbt и dbt Core в единый, более связный опыт работы с dbt.
- Предоставления пользователям dbt и dbt Core информации о моделях и активах в Catalog. Для доступа к Catalog необходима лицензия developer или read-only.
- (Скоро) Возможности для пользователей, работающих в Canvas, развивать модели, уже созданные центральной командой данных в dbt Core, без необходимости начинать с нуля.
Hybrid projects доступны в рамках закрытой беты для dbt Enterprise-аккаунтов. Чтобы зарегистрировать интерес к бете, свяжитесь с вашим аккаунт-менеджером.
Управление изменениями в устаревших поведениях
dbt Core v1.10 вводит новые флаги для управления изменениями устаревшего поведения. Вы можете включать недавно добавленные изменения (по умолчанию отключены) или, наоборот, отключать зрелые изменения (по умолчанию включены), задавая значения True / False для flags в dbt_project.yml.
Подробнее о каждом изменении поведения можно прочитать по следующим ссылкам:
- (Добавлено, отключено по умолчанию)
validate_macro_args. Если флаг установлен вTrue, dbt выдаст предупреждение, если имена аргументовtype, указанные в YAML для макросов, не совпадают с именами аргументов в самом макросе или если типы аргументов не соответствуют поддерживаемым типам. - (Добавлено, отключено по умолчанию)
require_all_warnings_handled_by_warn_error. Если этот флаг установлен вTrue, все предупреждения, возникающие во время выполнения, будут обрабатываться через механизм--warn-error/--warn-error-options. Это обеспечивает единообразное поведение при повышении предупреждений до ошибок или их подавлении. Когда флаг равенFalse(текущее значение по умолчанию), только часть предупреждений проходит через этот механизм — остальные могут его обходить. Включение этого флага в проектах, использующих--warn-error(или--warn-error-options='{"error":"all"}'), может привести к падению сборок из‑за предупреждений, которые ранее игнорировались, поэтому мы рекомендуем включать его постепенно, по одному проекту за раз.
Предупреждения об устаревании
Начиная с версии v1.10, вы будете получать предупреждения об устаревании (deprecation warnings) для dbt-кода, который станет недопустимым в будущем, включая:
- Пользовательские входные данные (например, нераспознанные свойства ресурсов, конфигурации и ключи верхнего уровня)
- Дублирующиеся ключи YAML в одном файле
- Неожиданные Jinja-блоки (например, теги
{% endmacro %}без соответствующего тега{% macro %}) - Перемещение некоторых
propertiesвconfigs - И другое
dbt начнёт выдавать эти предупреждения в версии 1.10, однако внесение изменений не является обязательным условием для её использования. В dbt Labs мы понимаем, что существующим пользователям потребуется время на миграцию проектов, и наша цель — не нарушить вашу работу этим обновлением. Основная цель — дать вам больше безопасности, обратной связи и уверенности в дальнейшей работе.
Что это значит для вас?
- Если в вашем проекте (или пакете dbt) появляется новое предупреждение об устаревании в
v1.10, запланируйте обновление некорректного кода в ближайшее время. Пока это всего лишь предупреждение, но в будущих версиях dbt будет применяться более строгая валидация входных данных проекта. Обратите внимание на инструментdbt-autofix, который может автоматически исправить многие из этих проблем. - В будущем конфигурация
metaстанет единственным местом для пользовательских атрибутов. Всё остальное будет строго типизировано и валидировано. Если у вас есть дополнительный атрибут, который вы хотите включить в проект, или конфигурация модели, к которой нужно обращаться в кастомной материализации, в дальнейшем её необходимо размещать внутриmeta. - Если вы используете флаг
—-warn-error(или--warn-error-options '{"error": "all"}') для повышения всех предупреждений до уровня ошибок, это будет включать и новые предупреждения об устаревании, появившиеся в dbt Core. Если вы не хотите, чтобы они становились ошибками, флаг--warn-error-optionsпозволяет более гибко управлять тем, какие типы предупреждений считаются ошибками. Вы можете задать"warn": ["Deprecations"](новое вv1.10), чтобы продолжать обрабатывать предупреждения об устаревании как предупреждения. - Флаг
--models/--model/-mбыл переименован в--select/--sещё в dbt Core v0.21 (октябрь 2021). Тихое игнорирование этого флага означает игнорирование критериев выбора в команде, что может привести к сборке всего DAG вместо небольшой подмножества моделей. По этой причине флаг--models/--model/-mбудет выдавать предупреждение в dbt Core v1.10 и ошибку в Fusion. Пожалуйста, обновите определения ваших job’ов соответствующим образом.
Пользовательские входные данные
Исторически dbt позволял настраивать входные данные практически без ограничений. Типичный пример — задание пользовательских свойств в YAML:
models:
- name: my_model
description: A model in my project.
dbt_is_awesome: true # пользовательское свойство
dbt обнаруживает нераспознанное пользовательское свойство (dbt_is_awesome) и молча продолжает работу. При отсутствии строго определённого набора входных данных становится сложно валидировать конфигурацию проекта. Это приводит к непреднамеренным проблемам, таким как:
- Тихое игнорирование опечаток в свойствах и конфигурациях (например,
desciption:вместоdescription:). - Непреднамеренные конфликты с пользовательским кодом, когда dbt вводит новое «зарезервированное» свойство или конфигурацию.
Если у вас есть нераспознанное пользовательское свойство, вы получите предупреждение, а в будущей версии dbt поддержка таких свойств будет прекращена. В дальнейшем их следует размещать внутри конфигурации meta, которая станет единственным местом для пользовательских атрибутов:
models:
- name: my_model
description: A model in my project.
config:
meta:
dbt_is_awesome: true
Пользовательские ключи не вложенные под meta
Ранее возможность определять любые дополнительные поля напрямую под config могла приводить к конфликтам между пользовательскими конфигурациями и официальными конфигурациями фреймворка dbt.
В будущем конфигурация meta станет единственным допустимым местом для пользовательских атрибутов. Всё остальное будет строго типизировано и валидировано. Если у вас есть дополнительный атрибут, который вы хотите включить в проект, или конфигурация модели, к которой требуется доступ в кастомной материализации, её необходимо размещать под meta:
models:
- name: my_model
config:
meta:
custom_config_key: value
columns:
- name: my_column
config:
meta:
some_key: some_value
Дублирующиеся ключи в одном YAML‑файле
Если в одном properties YAML-файле присутствуют два одинаковых ключа, вы получите предупреждение, а в будущей версии dbt поддержка дублирующихся ключей будет прекращена. Ранее при наличии одинаковых ключей dbt молча перезаписывал значение, используя последнюю конфигурацию в файле.
my_profile:
target: my_target
outputs:
...
my_profile: # dbt would use only this profile key
target: my_other_target
outputs:
...
В дальнейшем следует удалить неиспользуемые ключи или перенести их в отдельный properties YAML-файл.
Неожиданные Jinja-блоки
Если у вас есть «осиротевший» Jinja-блок, вы получите предупреждение, а в будущей версии dbt поддержка неожиданных Jinja-блоков будет прекращена. Ранее такие блоки молча игнорировались.
{% endmacro %} # orphaned endmacro jinja block
{% macro hello() %}
hello!
{% endmacro %}
В дальнейшем следует удалить такие осиротевшие Jinja-блоки.
Свойства, перемещённые в конфигурацию
Некоторые исторические properties полностью перемещаются в configs.
К ним относятся: freshness, meta, tags, docs, group и access.
Если ранее вы задавали одно из затронутых свойств, например freshness:
sources:
- name: ecom
schema: raw
description: E-commerce data for the Jaffle Shop
freshness:
warn_after:
count: 24
period: hour
Теперь его следует задавать внутри config:
sources:
- name: ecom
schema: raw
description: E-commerce data for the Jaffle Shop
config:
freshness:
warn_after:
count: 24
period: hour
Пользовательский путь вывода для свежести источника
Возможность переопределять путь по умолчанию для sources.json с помощью флагов --output или -o была признана устаревшей. Вы по-прежнему можете задавать путь для всех artifacts с помощью --target-path, но при попытке указать путь только для source freshness будет выдаваться предупреждение.
Опции warn/error
Опции warn_error_option для include и exclude были признаны устаревшими и заменены на error и warn соответственно.
...
flags:
warn_error_options:
error: # Previously called "include"
warn: # Previously called "exclude"
silence: # To silence or ignore warnings
- NoNodesForSelectionCriteria
Адаптер-специфичные возможности и функциональность
Snowflake
- Вы можете использовать параметр
platform_detection_timeout_seconds, чтобы управлять временем ожидания коннектора Snowflake при определении облачной платформы, с которой устанавливается соединение. Подробнее см. в разделе Snowflake setup.
BigQuery
dbt-bigqueryотменяет задания BigQuery, превышающие настроенный таймаут, отправляя запрос на отмену. Если запрос выполнен успешно, dbt останавливает задание. Если запрос не удался, задание BigQuery может продолжать выполняться в фоне до завершения или до его ручной отмены. Подробнее см. в разделе Timeout and retries.
Коротко о главном
-
Используйте свойство
loaded_at_queryдля source freshness, чтобы задать собственный SQL для вычисления временной меткиmaxLoadedAtисточника (в отличие от встроенного запроса, который используетloaded_at_field). Нельзя определятьloaded_at_query, если также задана конфигурацияloaded_at_field. -
Используйте валидацию аргументов макросов с помощью флага
validate_macro_args, который по умолчанию отключён. При включении этот флаг проверяет, что имена аргументов, задокументированные для макроса, совпадают с определением макроса, а их типы соответствуют поддерживаемому формату. Ранее dbt не обеспечивал строгую проверку типов аргументов, рассматривая поле типа исключительно как документацию. Если аргументы не задокументированы, dbt выводит их из определения макроса и включает в файлmanifest.json. Подробнее см. раздел supported types.