如何在dbt中自动合并同结构的同前缀多模型?
在dbt中自动化合并带统一前缀的模型
当然可以实现,下面是两种实用的自动化方案,适配不同场景:
方案1:用dbt内置宏动态生成UNION ALL
dbt自带的generate_union_all宏,搭配get_relations_by_pattern可以自动匹配所有带指定前缀的模型,彻底告别手动维护UNION语句的麻烦。
创建一个新的dbt模型(比如命名为avengers_unioned.sql),写入以下代码:
{% set target_models = get_relations_by_pattern(pattern='avengers_%') %} {{ generate_union_all(relations=target_models) }}
get_relations_by_pattern会自动扫描项目中所有名称以avengers_开头的模型generate_union_all会基于这些模型自动生成完整的UNION ALL SQL
后续新增avengers_xx类模型时,完全不用修改这个文件,dbt运行时会自动把新模型纳入合并范围。
如果需要排除某些前缀匹配但不需要合并的模型(比如中间表avengers_staging),可以添加过滤规则:
{% set target_models = get_relations_by_pattern(pattern='avengers_%') | rejectattr('name', 'equalto', 'avengers_staging') %} {{ generate_union_all(relations=target_models) }}
方案2:利用数据仓库的通配符查询(限支持的仓库)
如果你的数据仓库支持表名通配符或动态表查询(比如BigQuery、Snowflake),可以直接写SQL实现,不依赖dbt宏:
Snowflake示例:
SELECT * FROM ( SELECT CONCAT('{{ target.schema }}.', table_name) AS table_full_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '{{ target.schema }}' AND table_name LIKE 'avengers_%' ) t, LATERAL (SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())))
BigQuery示例:
SELECT * FROM `{{ project_id }}.{{ target.dataset }}.avengers_*`
这种方式更直接,但要确保所有目标表的结构完全一致(字段名、数据类型必须匹配),否则会出现查询错误。
关键注意点
- 所有待合并的模型必须结构完全一致,否则UNION ALL会因字段不匹配报错
- 使用
get_relations_by_pattern时,可通过指定schema(比如pattern='my_schema.avengers_%')缩小匹配范围,避免误匹配其他schema的表
内容的提问来源于stack exchange,提问作者Iren Ramadhan
相关产品推荐
相关产品推荐

