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

У меня ситуация, как показано ниже:

В моем проекте dbt две модели

  1. модель-А
{{ config(
    materialized='ephemeral',
    alias='A_0001',
    schema=var('xxx_yyy_dataset')
) }}
  1. модель-B
{{ config(
    materialized='ephemeral',
    alias='B_0002',
    schema=var('xxx_yyy_dataset')
) }}

И они материализуются как инкрементальные в той же схеме, что и xxx_yyy_dataset.Table_DDD

{{ config(
    materialized='incremental',
    alias='Table_DDD',
    schema=var('xxx_yyy_dataset')
) }}
SELECT * FROM {{ref('A_0001')}}
UNION ALL
SELECT * FROM {{ref('B_0002')}}

Это работает нормально, и он загружает записи в целевую таблицу.

Теперь я представил другую модель - модель-C и другую модель пакета-C.

{{ config(
    materialized='incremental',
    alias='Table_DDD',
    schema=var('xxx_yyy_dataset')
) }}

Это дает мне следующую ошибку:

$ dbt compile --profiles-dir=profile --target ide
Running with dbt=0.16.0
Encountered an error:
Compilation Error
  dbt found two resources with the database representation "xxx_yyy_dataset.Table_DDD".
  dbt cannot create two resources with identical database representations. To fix this,
  change the "schema" or "alias" configuration of one of these resources:
  - model.eplus_rnc_dbt_project.conrol_outcome_joined (models/controls/payment/fa-join/conrol_outcome_joined.sql)
  - model.eplus_rnc_dbt_project.dq_control_outcome_joined (models/controls/dq/dq-join/dq_control_outcome_joined.sql)

Я настроил макрос для пользовательского макроса, как показано ниже:

{% macro generate_schema_name(custom_schema_name, node) -%}
    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}
        {{ default_schema }}
    {%- else -%}
        {{ custom_schema_name }}
    {%- endif -%}
{%- endmacro %}


{% macro generate_alias_name(custom_alias_name=none, node=none) -%}
    {%- if custom_alias_name is none -%}
        {{ node.name }}
    {%- else -%}
        {{ custom_alias_name | trim }}
    enter code here
    {%- endif -%}
{%- endmacro %}

2 ответа

Dbt здесь делает свое дело!

У вас есть две модели с одинаковой конфигурацией - conrol_outcome_joined а также dq_control_outcome_joined.

Это означает, что они оба попытаются записать в одну и ту же таблицу: xxx_yyy_dataset.Table_DDD.

dbt (справедливо) выдает здесь ошибку, чтобы избежать проблемы.

Как следует из сообщения об ошибке, вам следует обновить одну из ваших моделей, чтобы использовать другую схему или псевдоним, чтобы она была представлена ​​в вашем проекте BigQuery в виде отдельной таблицы.

Я боролся с той же проблемой здесь, я хотел создать конвейер тестов, который будет записываться только в одну добавочную таблицу, и он вызывает одно и то же сообщение об ошибке, но я боюсь, что это невозможно с DBT.

Чтобы решить эту проблему, я создал основную модель, которая выбирает и объединяет информацию из всех отдельных тестовых моделей, которые я создал (ранее я создал модель/таблицу для каждого применяемого теста), и что в конце с post_hook я просто бросаю отдельные таблицы, созданные ранее, поэтому я придерживаюсь только окончательной таблицы тестирования, в которой хранится вся информация.

Это не то, чего я действительно хотел, поскольку это не динамическая реализация, потому что каждый созданный тест необходимо добавить в объединение основной таблицы, а также в оператор drop в post_hook, однако, если какой-либо тест сломается по отдельности, он не сломается. все остальные тесты, в моей базе данных нет кучи таблиц, когда я начинаю свою работу, вам просто нужно организовать это в нужное для вас время.

(Другим возможным подходом может быть создание 1 модели, где в pre_hook вы создаете все таблицы, которые хотите, поскольку dbt не может заставить модели писать в одну и ту же таблицу, в «основной» части модели вы выбираете и объединяете информацию обо всех таблицах до хука, а затем в пост-хуке вы удаляете таблицы, созданные ранее, не уверен, что это может работать, не тестировалось, но вы уменьшаете количество таблиц, записываемых в базу данных, которая является основным недостаток 1-го подхода хотя и на короткий промежуток времени)

Другие вопросы по тегам