使用dbt for循环在BigQuery中创建多个表



我试图在BigQuery中使用dbt中的for循环在单个数据集中创建单独的表,遍历帐户列表,但到目前为止没有成功。一点上下文-我正在使用Stitch从Facebook广告中获取数据,并将其推送到我们的BigQuery仓库。然后,根据下面的模型,为每个帐户创建新的单独表,其中包含汇总/建模的数据。

变量的声明看起来像:

-- table that contains list of accounts
{% set account_data = ref('bq_acct_list') %} 
{% set accounts = get_column_values(table=account_data, column='bq_name_suffix') %}

表必须基于以下查询创建:

SELECT 
DATE_TRUNC(DATE(date_start), DAY) date,
account_id,
account_name,
ROUND(SUM(spend), 2) ad_spend
FROM `{{ target.project }}.{{account}}.ads_insights`
GROUP BY 1, 2, 3

缺少的(我认为(是查询的包装器+for循环本身。有人能帮我填空吗?

dbt在一个模型(即models/目录中的.sql文件(由数据仓库中的一个对象(表/视图(表示的范式下运行——目前还没有办法解决这个问题。

如果您需要为每个帐户维护单独的表,我会考虑:

  1. 将逻辑封装到宏中:
-- macros/account_transform.sql
{% macro account_transform(account) %}
SELECT 
DATE_TRUNC(DATE(date_start), DAY) date,
account_id,
account_name,
ROUND(SUM(spend), 2) ad_spend
FROM `{{ target.project }}.{{ account }}.ads_insights`
GROUP BY 1, 2, 3
{% endmacro %}
  1. 每个帐户创建一个单独的模型,并在每个模型中调用宏:
-- models/my_first_account.sql
{{ account_transform('my_first_account') }}
-- models/my_second_account.sql
{{ account_transform('my_second_account') }}

根据您的具体用例,您还可以考虑为所有帐户创建一个主表,将它们联合在一起。这样,您只需要创建一个模型。查看";将相同结构的源"统一在一起";了解这种方法的一些技术。