如何在雪花中使用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)。成功了。
然后我尝试了包含列表,但大写了,瞧 - 它按预期工作。
我有以下代码:
{{
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 中获取所有列名并插入它们。为什么是这样?我读过
我的猜测是宏无法从您命名的关系中获取列名 (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)。成功了。
然后我尝试了包含列表,但大写了,瞧 - 它按预期工作。