首页 > 解决方案 > 是否可以将动态值传递给 dbt 源新鲜度测试?

问题描述

我正在尝试根据基础源的“synced_at”列的中位数和标准差动态确定在 dbt sources.yml 中指定的新鲜度检查的警告和错误。

为此,我想我可能会尝试在 source.yml 文件的新鲜度块中传递一个宏,如下所示:

# sources.yml
...
    tables:
      - name: appointment_type
        freshness:
          error_after:
            count: test_macro()
            period: hour
...

在哪里:

{%- macro test_macro(this) -%}

{# /*
The idea is {{ this.table }} would parameterize a query, 
going over the same column name for all sources, _fivetran_synced, 
and spit out the calculated values I want. This makes me feel like 
it needs to be a prehook, that somehow stores the value in a var, 
and that is accessed in the source.yml, instead of calling it directly. 

In this case a trivial integer is attempted to be returned, just as an example.
*/ #}
{{ return(24) }}

{%- endmacro -%}

但是,这会导致类型错误。大概宏根本没有被调用。用 jinja 引号括起来也会返回错误。

我很好奇目前是否可以通过任何方式将动态值传递给新鲜度检查?

标签: pythonsqljinja2dbt

解决方案


今天不可能从.yml文件中调用宏,正是因为这个原因:dbt 需要能够在freshness对数据库运行任何查询之前静态解析这些文件并验证内部对象(包括资源属性,如 source )。

我认为您可以通过重写宏来解决这个问题,而不是简单地返回一个与 Z-score 不同的时间戳,基于所有 Fivetran时间戳进行标准化。感觉很棘手,但有可能。collect_freshnessmax(synced_at)current_timestampmax(synced_at)

同时,我会在这里轻轻地推回你更大的目标。我们认为来源新鲜度应该是规定性的。您可以告诉 Fivetran 您希望它多久同步一次数据,并添加freshness块来测试这些期望。您可以像上面设想的那样运行临时查询,以确定这些期望是否合理。显然,有些表的更新不频繁或不可预测,但我发现覆盖或删除这些表的新鲜度期望比增加其帐户的显着复杂性更有用。


推荐阅读