dbt增量模型pre_hook报错:是否需提前创建表结构?
问题描述
我的dbt模型配置如下:
{{ config( materialized='incremental', incremental_strategy='append', pre_hook='DELETE FROM {{ this }} WHERE r_date <> CURRENT_DATE' ) }}
执行dbt run时,pre_hook报错,提示找不到{{ this }}对应的模型表,属于标准SQL错误。请问运行该模型前,是否需要手动执行DDL创建模型的表框架?
解答
不需要手动执行DDL创建表框架,但你的pre_hook逻辑存在问题——当模型第一次运行时,目标表还不存在,pre_hook里的DELETE语句自然会报错找不到表。
解决方法有两种:
- 方法一:给pre_hook添加表存在判断
根据你使用的数据库类型,在DELETE语句前加上表存在的检查逻辑。比如:- PostgreSQL:
pre_hook='DELETE FROM {{ this }} WHERE EXISTS (SELECT 1 FROM {{ this }}) AND r_date <> CURRENT_DATE' - BigQuery:
pre_hook='IF EXISTS (SELECT 1 FROM `{{ this.database }}.{{ this.schema }}.{{ this.table }}`) THEN DELETE FROM {{ this }} WHERE r_date <> CURRENT_DATE END IF'
- PostgreSQL:
- 方法二:仅在增量运行时执行pre_hook
利用dbt的is_incremental()宏,让pre_hook只在模型增量更新时触发,第一次全量创建表时不执行:{{ config( materialized='incremental', incremental_strategy='append', pre_hook=[ "{% if is_incremental() %} DELETE FROM {{ this }} WHERE r_date <> CURRENT_DATE {% endif %}" ] ) }}
推荐方法二,因为它更贴合dbt增量模型的运行逻辑:第一次运行时dbt会自动创建表结构,后续增量运行时才执行pre_hook的清理操作,完全不需要手动干预DDL。
内容的提问来源于stack exchange,提问作者PURWU
相关产品推荐
相关产品推荐

