【问题标题】:DBT filtering for (None) when running on incremental model在增量模型上运行时对(无)进行 DBT 过滤
【发布时间】:2021-11-26 21:12:53
【问题描述】:

我正在尝试将 DBT 模型配置为 materialized='incremental',但它失败了,因为 DBT 似乎通过检查 (None) or (None) is null 来包装我的模型,这导致模型针对目标 (Bigquery) 引发 SQL 异常. (None) 检查似乎没有为非增量模型添加,或者在使用 --full-refresh 运行时,它只是重新创建表。

根据the docs,增量模型应该如下包装:

merge into {{ destination_table }} DEST
using ({{ model_sql }}) SRC
...

但是我看到的是:

merge into {{ destination_table }} DEST
using ( select * from( {{ model_sql }} ) where (None) or (None) is null) SRC
...

我不清楚 (None) 检查的来源、包装查询实际上试图实现什么以及需要设置什么(如果有)模型配置来纠正这个问题。

我的模型配置设置为{{ config(materialized='incremental', alias='some_name') }},我也尝试设置unique_key,以防万一没有运气。

我正在使用dbt run --profiles-dir dbt_profiles --models ${MODEL} --target development 运行模型,并且可以确认已编译的模型正常,并且为模型运行添加了(None) 检查。

我正在运行 dbt 0.11.1(旧的 repo 版本)。

任何帮助将不胜感激!

【问题讨论】:

  • 不幸的是,您引用的文档适用于当前版本的 dbt (0.21.0),因此您落后了 10 个版本!从那以后发生了很多变化,尤其是对于 BQ。你的配置中有partition_by,你的模型中有{% if is_incremental() %}吗?尽可能多地发布特定于 dbt 的代码(编辑任何敏感代码)可能会更有帮助。
  • 您的评论鼓励我四处寻找0.11 来源,并在下面找到答案。谢谢!

标签: sql google-bigquery dbt


【解决方案1】:

通过查看我的目标版本的 github 上的 DBT 代码库,设法解决了这个问题 - incremental macro 0.11

似乎在 0.11 DBT 中需要设置一个 sql_where 配置标志,用于选择要用于增量加载的记录(is_incremental() 宏的前导)。

在我的例子中,由于我只想在每次增量运行中加载所有行并使用加载时间戳进行标记,因此设置sql_where='TRUE' 会生成有效的续集并且不会过滤我的结果(即WHERE TRUE OR TRUE IS NULL

【讨论】:

    【解决方案2】:

    您是否使用0.11.1 预先配置了增量模型?我很确定您需要使用{{ this }},但可能在0.11.1 版本中不存在。 docs on this

    【讨论】:

      猜你喜欢
      • 2022-11-11
      • 1970-01-01
      • 2023-01-14
      • 2022-11-24
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2014-09-08
      相关资源
      最近更新 更多