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)
要明确一个重要区别 - BigQuery 支持两种不同类型的“按日期分解为块的表”:
该*
语法可与日期分片表一起使用。但是,您没有日期分片表。当且仅当后缀的形式为 时,BigQuery 才会自动整理同一数据集中具有相同后缀名称的表YYYYMMDD
。
您的后缀的形式为YYYYMM
,因此 BigQuery 不会将其识别为单个日期分片表集合。这是它不适合你的第一个原因。
第二个原因(一旦你解决了这个问题)是你需要在分片表名周围使用反引号:
SELECT * FROM `ad_d_*`
Run Code Online (Sandbox Code Playgroud)
还有第三个问题,我想这会让您感到困惑。
从屏幕截图中的图标来看,您似乎所做的是创建许多分区表(每个分区表都有正确的图标作为分区表)。这是不正确的用法:分区表应该是带有分区键的单个表,BigQuery 将在“幕后”使用该表将数据拆分为块。
有几种方法可以解决这个问题。
ad_d
。您可以使用摄取时间分区进行配置,或者如果表包含日期/时间戳列,您可以使用时间单位分区并以此列作为分区键。您可以将其配置为使用“每月”分区,因为这似乎就是您想要的。在 DBT 中,您可以按照标准方式使用这个单一表作为源。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 模型中一样引用此源。
归档时间: |
|
查看次数: |
995 次 |
最近记录: |