DBT 合并分区修剪

问题描述 投票:0回答:1

这是我第一次与dbt合作!我已经使用 #db-bigquery 成功实现了增量模型,并使用以下配置

{{ config(
    materialized='incremental', 
    alias='sale_transactions', 
    schema='marts', 
    unique_key='unique_key',
    partition_by={
      "field": "sale_date",
      "data_type": "timestamp",
      "granularity": "day"
    },
    require_partition_filter = false,
    database="iprocure-edw"
) }}

模型运行良好,尽管模型每次运行时都会扫描整个目标表。

源数据既有新增数据,也有变更数据。分区列上的更改不超过 3 个月。

合并语句仅根据唯一键进行检查

DBT_INTERNAL_SOURCE.unique_key = DBT_INTERNAL_DEST.unique_key
,但没有日期过滤器。

我希望能够修剪分区并仅扫描相关分区,以避免成本非常高的全面扫描。

如何在

dbt
生成的合并查询中添加日期过滤器,这将减少
BigQuery
扫描的数据量。

已经找到了这个,尽管我不知道如何/在哪里可以使用该解决方案

google-bigquery partitioning data-warehouse dbt sql-merge
1个回答
1
投票

您可以将增量谓词配置与分区过滤器一起使用到 config() 块中,dbt 会将其添加到场景后面的合并语句中。

{{ config(
    materialized='incremental',
    ...
    incremental_predicates = ["DBT_INTERNAL_DEST.sale_date > '2024-01-01'"] 
)}}

合并语句将如下所示,按分区字段进行过滤。

merge into table_name as DBT_INTERNAL_DEST
using (  sql_statement ) as DBT_INTERNAL_SOURCE
on ( DBT_INTERNAL_DEST.sale_date > '2024-01-01' )
and ( DBT_INTERNAL_DEST.sale_date = DBT_INTERNAL_SOURCE.sale_date )

when matched then update set
  ... 
when not matched then insert
  ...
values 
© www.soinside.com 2019 - 2024. All rights reserved.