这是我第一次与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
扫描的数据量。
已经找到了这个,尽管我不知道如何/在哪里可以使用该解决方案
您可以将增量谓词配置与分区过滤器一起使用到 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