use/design dbt 关系测试的好方法

Good way to use/design dbt relation test

我想对模型进行 dbt 关系测试 m_0。

models:
  - name: m_0
    columns:
      - name: customer_id
        tests:
          - relationships:
              to: ref('m_1')
              field: id

然后我有两个问题:

  1. 我在模式 s_a 下 运行 配置模型 m_0,如何处理 m_1 不存在的情况?不能保证 m_1 必须是 运行 在 m_0 之前。
  2. 如何保证关系测试结果不不稳定?由于 m_0 和 m_1 是独立安排的,一些最新的 id 可能不会从 m_1 中读取但已经在 m_0.

编写 dbt 关系测试有什么好的做法吗? m_0和m_1有什么要求吗?例如 m_1 应该是 m_0 的父 table?

  1. 测试是它自己的节点,它将在 m_0 和 m_1 的 DAG 下游。如果您 运行 像 dbt build 这样的命令,dbt 将在 运行 测试此关系之前首先构建 m_0 和 m_1。但是,您是对的,如果 运行 dbt test -s m_0 和 m_1 尚未构建,测试将失败。如果要避免这种失败,可以使用dbt test -s m_0 --indirect-selection=cautious,关系测试不会运行。参见 the docs

  2. 您应该考虑向此测试添加一个 where: 配置,以限制在 m_0 中测试的记录。例如,where: created_at < current_timestamp - interval '1 day'。这应该在 m_1 中留下“额外”的记录,但是这个测试只关心 m_1 中丢失的记录,所以它会通过