dbt宏开发疑问:生成排除指定字段的校验和时表参数如何传入?
dbt宏表参数传入指南
问题分析
你的宏当前存在两个潜在问题:
- 参数名
source与dbt内置的source()函数重名,容易引发语法混淆 - 未明确表的引用方式(是数据源还是dbt模型)
修正后的宏示例
先将参数名改为无冲突的名称,比如table_ref:
{% macro generate_checksum(table_ref) %} SELECT HASH(*) AS hash_value FROM ( SELECT * EXCLUDE (a, b, f, c, d, e, z, g) FROM {{ table_ref }} ) {% endmacro %}
传入参数的两种场景
场景1:引用dbt数据源(Source)
如果目标表是在dbt_project.yml或sources.yml中定义的数据源,调用宏时传入source('源名称', '表名称'):{{ generate_checksum(source('my_source', 'user_table')) }}场景2:引用dbt模型(Model)
如果目标表是你自己开发的dbt模型,调用宏时传入ref('模型名称'):{{ generate_checksum(ref('stg_user_data')) }}
额外注意事项
* EXCLUDE语法仅部分数仓支持(如Snowflake),如果使用BigQuery需替换为* EXCEPT,Redshift则需要手动列出要保留的字段。
内容的提问来源于stack exchange,提问作者0004
相关产品推荐
相关产品推荐

