【问题标题】:How to access BigQuery table metadata in DBT using jinja?如何使用 jinja 访问 DBT 中的 BigQuery 表元数据?
【发布时间】:2022-11-11 00:58:59
【问题描述】:

我想从充当源的 BigQuery 表的元数据中访问上次修改时间列。我想创建一个通用测试来检查源表的最后修改日期是否等于今天。

在 BigQuery 中,您可以通过以下方式访问这些数据:

SELECT
last_modified_time
FROM `project.dataset.__TABLES__`
WHERE table_id = 'table_id'

我的目标是根据应用此测试的模型使 project.dataset 动态化。同样,我希望 table_id 是动态的。

鉴于 DBT 在他们的文档中提到 BigQuery 的数据集在定义上与“模式”相似,我尝试了这个,但没有奏效。

{% test last_modified_time(schema, model) %}

SELECT
  last_modified_time
FROM `{{ database }}.{{ schema }}.__TABLES__`
WHERE table_id = {{ model }}

{% endtest %}

它的作用是为数据库和模式呈现项目名称。 此外,模型(当然)会渲染 project.dataset.table_id 路径,而我只需要 table_id。

我对 DBT 很陌生,但我找不到任何与我正在寻找的东西相似的东西。

【问题讨论】:

    标签: sql google-bigquery dbt


    【解决方案1】:

    您需要进行一些更改:

    1. 您的通用测试接受名为schema 的参数,执行测试时dbt 不会提供该参数。测试应该只接受model,然后您需要配置您的 yaml 文件,以便测试在模型上(而不是在列上):

      models:
          - name: my_model
            tests:
                - last_modified_time
      
    2. model 参数是 Relation,您可以使用它来获取模型的数据库/项目、模式/数据集和标识符(具体化名称)。

    3. 如果返回任何记录,测试将失败。所以你的测试总是会失败。您需要将 last_modified_time 与当前日期进行比较,并且只返回早于当前日期的记录。

      把所有这些放在一起:

      {% test last_modified_time(model) %}
      
      with t as (
          SELECT last_modified_time
          FROM `{{ model.database }}.{{ model.schema }}.__TABLES__`
          WHERE table_id = {{ model.identifier }}
      )
      select *
      from t
      where t.last_modified_time < current_date()
      
      {% endtest %}
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2022-01-09
      • 2021-11-25
      • 2022-08-03
      • 2021-12-29
      • 2019-08-01
      相关资源
      最近更新 更多