dbt增量模型调用is_incremental()时Unrecognized name错误排查
问题:dbt增量模型启用时提示字段未识别(Unrecognized name: date_consultation_scheduled_tz)
核心原因分析
非增量模式正常运行,但启用增量逻辑就报错,问题根源出在dbt增量模型的运行机制上:
- 当dbt执行增量模型时,会先查询当前已生成的目标表(该模型之前构建的表)来获取增量边界值(比如你用到的
macro_incremental_max_date宏)。 - 你的目标表仅包含外层SELECT输出的字段(
client_id、time_to_call、consultation_scheduled_date等),并不包含源表的date_consultation_scheduled_tz字段。如果自定义宏或增量过滤逻辑不小心在查询目标表时引用了这个不存在的字段,就会触发报错。 - 另一种可能:增量过滤条件错误依赖了目标表的字段别名,而非源表的原始字段。
解决方案
1. 检查并修正自定义宏macro_incremental_max_date
确保宏仅查询目标表中存在的字段。正确的宏实现示例:
{% macro macro_incremental_max_date(column_name) %} (SELECT MAX({{ column_name }}) FROM {{ this }}) {% endmacro %}
如果宏内部错误引用了date_consultation_scheduled_tz(比如写成MAX(date({{ column_name }}_tz))),需立即修正为目标表已有的字段名(consultation_scheduled_date)。
2. 修改增量过滤逻辑,基于源表原始字段过滤
将子查询中的WHERE条件改为直接使用源表的date_consultation_scheduled_tz字段,而非别名后的consultation_scheduled_date:
select client_id , time_to_call , consultation_scheduled_date , abs({{count_not_work_days('weekend', 'date_screened', 'consultation_scheduled_date')}}) as calc_time_to_call_weekday , abs({{count_not_work_days('holidays', 'date_screened', 'consultation_scheduled_date')}}) as calc_time_to_call_holidays from( select client_id , date(date_screened_at) as date_screened , date(date_consultation_scheduled_tz) as consultation_scheduled_date , abs(date_diff(date(date_screened), date(date_consultation_scheduled_tz), day)) as time_to_call from {{ref ('dimension_clients_table')}} {% if is_incremental() %} -- 直接用源表的原始字段过滤 WHERE DATE(date_consultation_scheduled_tz) >= DATE("{{ macro_incremental_max_date('consultation_scheduled_date') }}") {% endif %} )
这样过滤逻辑直接在源表层面执行,不会涉及目标表的字段缺失问题。
3. 重置目标表结构(若之前全量运行的表结构不一致)
如果之前以非增量模式运行过该模型,目标表的结构可能和当前增量模型的输出结构存在差异。执行全量刷新命令重置表:
dbt run --models <你的模型名> --full-refresh
之后再以增量模式运行模型。
内容的提问来源于stack exchange,提问作者Juice_n_jingles
相关产品推荐
相关产品推荐

