我有以下代码:
{{
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
);
显然,它并不是从该表中获取所有的列名并插入它们。为什么会这样呢?我读到过here,dbt_utils.union_relation依赖于信息模式来构建它的查询。也许雪花信息模式是dbt无法发现的?
发布于 2021-11-25 15:15:36
我遇到了同样的问题--或者似乎是同样的问题,也是在Snowflake上使用DBT。
在我的例子中,我在创建源代码时没有引用列,所以案例是Snowflake default (大写)。这与包含列表不匹配,因为它都是小写的。
因此,在我的情况下,我首先删除了包含列表(创建了源表的副本)。这很管用。
然后我尝试了包含列表,但大小写,瞧-它按预期工作。
发布于 2021-11-23 17:07:14
我的猜测是,宏无法从您正在命名的关系(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
语句,以获得有关错误位置的更多信息。
https://stackoverflow.com/questions/70072706
复制相似问题