dbt不能创建具有相同数据库表示形式的两个资源



我的情况如下:

在我的dbt项目中有两个模型

  1. 型号A
{{ 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')}}

这运行良好,并且正在将记录摄取到目标表中。

现在我介绍了另一种型号-model-C ind不同的包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 %}

dbt正在这里完成它的工作!

您有两个型号共享完全相同的配置——conrol_outcome_joineddq_control_outcome_joined

这意味着它们都将尝试写入同一个表:xxx_yyy_dataset.Table_DDD

dbt(理所当然地(在这里抛出了一个错误以避免出现问题。

正如错误消息所建议的那样,您应该更新其中一个模型以使用不同的模式或别名,这样它就可以在BigQuery项目中作为一个单独的表来表示。

我一直在努力解决同样的问题,我想创建一个测试管道,它只会写入一个增量表,并且会触发相同的错误消息,但我担心DBT不可能做到这一点。

为了解决这个问题,我创建了一个主模型,它从我创建的所有单独的测试模型中选择并合并信息(我之前为要应用的每个测试创建了模型/表(,最后在post_hook中,我只删除了之前创建的各个表,因此,我只坚持使用保留所有信息的最终测试表。

这不是我真正想要的,因为它不是一个动态实现,因为创建的每个测试都需要添加到主表并集和post_hook中的drop语句中,但是,如果任何测试单独中断,它不会中断所有其他测试,当我开始工作时,我的数据库中也不存在一堆表,你只需要在合适的时间为自己精心安排。

(另一种可能的方法是创建一个模型,在pre_hook中,您创建所有想要的表,因为dbt不能让模型写入同一个表,所以在模型的"main"部分,您选择并合并所有预挂接表的信息,然后在后挂接中删除之前创建的表,不确定这是否有效,而不是经过测试,但您确实减少了写入数据库的表的数量,这是第一种方法的主要缺点,尽管时间很短(

最新更新