如何在同一GCP项目的dbt中跨多个BigQuery数据集编写查询?
dbt跨BigQuery多数据集查询实现方案
核心思路
不用修改全局target或profiles.yml的默认数据集配置,只需给每个模型单独指定目标数据集,并通过dbt的引用函数关联不同数据集的表即可。
1. 编写主模型代码
创建输出模型文件(比如models/dataset_z/table_thisistheoutput.sql),用ref()引用其他数据集的模型,代码如下:
{{ config( dataset='dataset_Z' ) }} with first_table as ( select * from {{ ref('table_thishasinfo') }} ), second_table as ( select * from {{ ref('table_thishasmoreinfo') }} ) select * from first_table ft left join second_table st on ft.id = st.id
2. 配置各模型的目标数据集
给table_thishasinfo、table_thishasmoreinfo这两个模型指定对应的数据集,有两种方式:
方式一:单模型配置(在模型文件顶部添加)
比如models/dataset_x/table_thishasinfo.sql:
{{ config( dataset='dataset_X' ) }} -- 这里写该模型的原始逻辑,比如从源表读取数据 select * from ...
models/dataset_y/table_thishasmoreinfo.sql:
{{ config( dataset='dataset_Y' ) }} -- 这里写该模型的原始逻辑 select * from ...
方式二:批量配置(在dbt_project.yml中设置)
按模型所在目录分组,批量指定数据集,避免重复配置:
models: your_dbt_project_name: # 替换成你的dbt项目名称 dataset_x: +dataset: dataset_X dataset_y: +dataset: dataset_Y dataset_z: +dataset: dataset_Z
3. 源表的特殊处理(如果引用的是非dbt生成的表)
如果table_thishasinfo和table_thishasmoreinfo是BigQuery中已存在的源表(不是dbt模型生成的),则用source()代替ref():
首先在models/sources.yml中定义源:
sources: - name: projectA dataset: dataset_X tables: - name: table_thishasinfo - name: projectA dataset: dataset_Y tables: - name: table_thishasmoreinfo
然后在主模型中引用:
{{ config( dataset='dataset_Z' ) }} with first_table as ( select * from {{ source('projectA', 'table_thishasinfo') }} ), second_table as ( select * from {{ source('projectA', 'table_thishasmoreinfo') }} ) select * from first_table ft left join second_table st on ft.id = st.id
4. 验证编译结果
运行dbt compile命令,查看target/compiled目录下的对应SQL文件,就能得到你预期的带完整projectA.dataset_X.table_thishasinfo格式的SQL代码。
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

