使用 dbt for-loop 在 BigQuery 中创建多个表

Posted

技术标签:

【中文标题】使用 dbt for-loop 在 BigQuery 中创建多个表【英文标题】:Create Multiple Tables in BigQuery Using dbt for-loop 【发布时间】:2020-07-24 09:28:48 【问题描述】:

我正在尝试使用 dbt 中的 for 循环在 BigQuery 中的单个数据集中创建单个表,遍历帐户列表,但到目前为止没有成功。 一点上下文 - 我正在使用 Stitch 从 Facebook Ads 获取数据并将其推送到我们的 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 循环本身。谁能帮我填空?

【问题讨论】:

【参考方案1】:

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

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

    将逻辑封装到宏中:
-- 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 %
    每个帐户创建一个单独的模型,并在每个模型中调用宏:
-- models/my_first_account.sql
 account_transform('my_first_account') 
-- models/my_second_account.sql
 account_transform('my_second_account') 

根据您的具体用例,您还可以考虑为所有 帐户创建一个主表,方法是将它们联合在一起。这样,您只需创建一个模型。查看有关“Unioning together identically-structured sources”的文章,了解这种方法的一些技巧。

【讨论】:

感谢您的澄清!我也在 dbt Slack 频道中进行了讨论,并在得知 dbt 仅支持 1 对 1 关系、模型到视图/表后得出了类似的结论。 (1) 所以第一个解决方案是,就像你提到的那样,为每个帐户创建一个单独的模型(使用宏来获取基线数据是一个好主意!)。 (2) 第二个是创建“all_accounts”模型/表,由于我使用 BQ 数据作为 Google Data Studio 中的数据源,我可以创建自定义查询,从 all_accounts 中选择每个单独的帐户。

以上是关于使用 dbt for-loop 在 BigQuery 中创建多个表的主要内容,如果未能解决你的问题,请参考以下文章

dbt可以连接同一个项目的不同数据库吗?

使用本地包编译 dbt 时出错

雪花存储过程从 dbt 失败

使用 dbt 的物化视图与表

在工作 dbt 项目中调用 packages.yml 中的 git repo

使用 pip 安装名为“dbt”的软件包时遇到问题