如何在雪花中使用dbt_utils.union_relations?

How to use dbt_utils.union_relations in snowflake?

我有以下代码:

{{
    config(
        materialized='table',
        unique_key='dbt_scd_id'
    )
}}

with unioned as (
  {{ dbt_utils.union_relations(
    relations=[
      ref('blaze_inventory_stg'),
    ],
    include=[
      "source_name",
      "location_id_ext",
      "product_name",
      "brand",
      "strain_name",
      "category",
      "product_weight_grams",
      "product_unit_of_measure",
      "purchase_category",
      "quantity",
      "sku",
      "dbt_updated_at",
      "dbt_valid_from",
      "dbt_valid_to",
      "dbt_scd_id"
    ]
  )}}
)

select * from unioned

它产生这个sql

      create or replace transient table POS_DATA.dbt_dev.retail_inventory_snapshot_stg  as
      (

with unioned as (
  

        (
            select

                cast('POS_DATA.dbt_dev.blaze_inventory_stg' as 
    varchar
) as _dbt_source_relation,
                

            from POS_DATA.dbt_dev.blaze_inventory_stg
        )

        
)

select * from unioned
      );

显然它没有从 table 中获取所有列名并插入它们。为什么是这样?我读过 dbt_utils.union_relation 依赖于信息架构来构建其查询。也许 dbt 无法发现雪花信息模式?

我的猜测是宏无法从您命名的关系中获取列名 (macro source code) 至于我不确定的原因。你打电话给 dbt run -m blaze_inventory_stg 了吗?

为了证明我的假设,制作一个新的模型文件,big_boy.sql,代码如下,然后运行 dbt run -m big_boy。我的猜测是这些列无法解析。

-- big_boy.sql
{% if execute %}
  {%- set cols = adapter.get_columns_in_relation(ref('blaze_inventory_stg')) -%}
  {{ log('colums: ' ~ cols, info=True) }}
{% endif %}

SELECT 1 as my_col

如果上述模型文件确实提取列并将列打印到控制台,则说明发生了其他问题。为了进一步调试,我建议将上面链接的 default__union_relations 宏重命名为新名称,然后在您的模型中调用新宏。然后你可以穿插 log 语句来获得更多关于哪里出了问题的信息。

我 运行 遇到同样的问题 - 或者似乎是同样的问题,也在 Snowflake 上使用 DBT。

在我的例子中,我在创建源代码时没有引用列,所以这个例子是 Snowflake 默认值(大写)。这与包含列表不匹配,因为它都是小写的。

因此,就我而言,我首先删除了包含列表(创建了源代码的副本 table)。成功了。

然后我尝试了包含列表,但大写了,瞧 - 它按预期工作。