Обнаружение таблицы для просмотра изменения материализации в CI

#dbt

#dbt

Вопрос:

Есть ли простой способ обнаружить изменение в материализации в CI, чтобы избежать сбоя при запуске dbt с ошибкой

 Compilation Error in model stores_stores
(models/marts/core/blah.sql)   Trying to create view
`blah`.`dbt`.`blah`, but it currently exists as a
table. Either drop `blah`.`dbt`.`blah` manually,
or run dbt with `--full-refresh` and dbt will drop it for you.
 

Спасибо!

Ответ №1:

Есть способ, однако он не особенно «легкий».

Что вы можете сделать, так это использовать артефакты, которые генерирует dbt.

  • manifest.json : создается compile , run , test , docs generate , ls
  • run_results.json : создается run , test , seed , snapshot , docs generate
  • catalog.json : создается docs generate

Информацию об изменении материализации можно найти как в , так run_results и в manifest . Однако в вашем контексте добавления проверки в CI для раннего сбоя вы хотите получать уведомления до получения ошибки от a dbt run . Таким образом, вы могли бы фактически сгенерировать manifest.json with dbt compile .

В nodes ключе манифеста у каждого узла будет config.materialized ключ, на который вы можете посмотреть. Вы можете проанализировать это с помощью командной строки или с помощью python и сохранить результат в файле JSON, который содержит информацию о материализации каждой модели. Этот файл может быть возвращен в ваш код, например.

 cat target/manifest.json | jq '.nodes | to_entries | map({node: .key, materialized: .value.config.materialized})' > old_state.json
 

Затем, после того, как вы внесли изменения в свой dbt-код, вам нужно выполнить

 dbt compile  # generates new manifest.json
cat target/manifest.json | jq '.nodes | to_entries | map({node: .key, materialized: .value.config.materialized})' > new_state.json
 

Затем вы можете сравнить два состояния, например diff , в командной строке. Я приведу пример вывода здесь:

 $ diff old_state.json new_state.json
12c12
<     "materialized": "table"
---
>     "materialized": "view"
 

Как я уже сказал, это не «легко» сказать, но я надеюсь, что мой ответ дал вам несколько идей о том, как действовать, чтобы получить то, что вы хотите. Если вас интересует более подробная информация, вы можете проверить мой пост в блоге по этой теме.