如何加载分片 bigquery 表作为 DBT 源

Chr*_*oph 1 jinja2 google-bigquery dbt

我是 dbt 新手,在 BigQuery 中我可以使用 asterix 查询大型数据集中的分区表。例如

select * from x.ads_d_*
Run Code Online (Sandbox Code Playgroud)

星号代表年份和月份,例如 202211。我如何在 dbt 中为此创建源。如果我使用 code-gen 包,它会为每个月创建一个表,但我不想每个月都更新它。

我读到有关增量数据源的内容,但我不确定这是否是我所需要的?有人能指出我正确的方向吗?

在 .yml 源定义中添加星号似乎不起作用。

架构.yml

version: 2

sources:
  - name: funnel_io_ads
    tables:
      - name: ad
      - schema: ad_d_*
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Pad*_*ton 5

一些背景

要明确一个重要区别 - BigQuery 支持两种不同类型的“按日期分解为块的表”:

  1. 日期分片表
  2. 分区表

这里是相关文档您可以在这里阅读解释

三个问题

*语法可与日期分片表一起使用。但是,您没有日期分片表。当且仅当后缀的形式为 时,BigQuery 才会自动整理同一数据集中具有相同后缀名称的表YYYYMMDD

您的后缀的形式为YYYYMM,因此 BigQuery 不会将其识别为单个日期分片表集合。这是它不适合你的第一个原因。

第二个原因(一旦你解决了这个问题)是你需要在分片表名周围使用反引号:

SELECT * FROM `ad_d_*`
Run Code Online (Sandbox Code Playgroud)

还有第三个问题,我想这会让您感到困惑。

从屏幕截图中的图标来看,您似乎所做的是创建许多分区表(每个分区表都有正确的图标作为分区表)。这是不正确的用法:分区表应该是带有分区键的单个表,BigQuery 将在“幕后”使用该表将数据拆分为块。

解决方案

有几种方法可以解决这个问题。

  1. 创建单个分区表ad_d。您可以使用摄取时间分区进行配置,或者如果表包含日期/时间戳列,您可以使用时间单位分区并以此列作为分区键。您可以将其配置为使用“每月”分区,因为这似乎就是您想要的。在 DBT 中,您可以按照标准方式使用这个单一表作为源。
  2. 创建一组真正的日期分片表。您需要 BigQuery 数据集中的表是 (a) 常规表,而不是分区表,以及 (b) 正确的后缀,例如,ad_d_20180201而不是ad_d_2018. 如果您实际上每月只有一张也没关系。

建议使用第一种方法。

但是,如果您有一些限制迫使您使用后者,您可以按如下方式配置 DBT 源:

sources:
  - name: funnel_io_ads
    database: <your GCP project ID>
    schema: funnel_io_ads
    tables:
      - name: ad
        identifier: ad_d_*
Run Code Online (Sandbox Code Playgroud)

然后,您将能够像{{ source('funnel_io_ads', 'ad') }}在 DBT 模型中一样引用此源。