You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:32:16