【问题标题】:Force skipping DBT models if source is not fresh如果源不是新鲜的,则强制跳过 DBT 模型
【发布时间】:2022-10-05 03:46:27
【问题描述】:
正如标题所说,如果我的一个来源没有使用 dbt 新鲜度更新/新鲜,我正在寻找一种方法来强制跳过模型。我们当前的设置如下:
我们基本上有从不同雪花表采购的模型,我们将它们具体化为一张表。源具有不同的新鲜度频率,如果模型的源之一未更新,我们希望它跳过该模型的计算/计算,因为它只会返回相同的数据。
我们已经尝试使用 Jinja 在模型本身中使用 if/else 并运行 \"SELECT * FROM {{this}}\" 以使用旧数据重新创建表,但它非常hacky并且不会真正跳过模型.
因此,我们正在寻找更好的方法来利用 DBT 新鲜度命令的结果来确定模型是应该运行还是只是被跳过。
标签:
snowflake-cloud-data-platform
dbt
【解决方案1】:
如果您正在运行 v1.1 或更新版本并且不介意实验性 API,则可以使用 source_status 选择器仅刷新来自已接收新数据的源的下游模型。来自docs:
作业状态的另一个元素是先前 dbt 调用的 source_status。例如,在执行 dbt source freshness 之后,dbt 创建 sources.json 工件,其中包含 dbt 源的执行时间和 max_loaded_at 日期。
这意味着在生产环境中运行 dbt 的脚本需要调用 dbt 两次,第一次调用会保存源的状态。同样,来自文档:
# You can also set the DBT_ARTIFACT_STATE_PATH environment variable instead of the --state flag.
$ dbt source freshness # must be run again to compare current to previous state
$ dbt build --select source_status:fresher+ --state path/to/prod/artifacts
如果你想做对面的,并从尚未更新的源中排除模型下游,您可以使用 --exclude 标志代替:
# You can also set the DBT_ARTIFACT_STATE_PATH environment variable instead of the --state flag.
$ dbt source freshness # must be run again to compare current to previous state
$ dbt build --exclude source_status:error+ --state path/to/prod/artifacts