大家好,欢迎来到IT知识分享网。
dbt测试功能概述
dbt test命令用于验证dbt项目中的模型(models)和其他资源(例如sources、seeds和snapshots)的正确性。通过运行dbt test命令,dbt会自动检查测试是否通过或失败。
可利用测试规则验证生成结果,提高每个模型中SQL的完整性。dbt的测试功能可验证模型中指定列是否包含非空值、唯一值。也可根据特定的业务逻辑自定义测试规则。
dbt会将测试逻辑转换成SQL查询语句,以获取校验“失败”数据记录数。这些SQL查询会根据数据集中的唯一性判断,生成查询重复数据项的Select语句,或者查询空值的Select语句。如果测试返回零条失败记录数,则测试通过。
在dbt中有两种方法实现测试功能:
- singular test 异常值测试:异常值测试是dbt中最简单的测试形式。其实现方法是编写返回校验失败的SQL查询语句,并将该查询语句保存在测试目录中的.SQL文件中。然后,使用dbt test命令执行该测试。
- generic test 通用测试:通用测试是一种参数化查询,测试校验查询是在一个特殊的测试块中定义的,就像一个宏。一旦定义,就可以在.yml文件中通过名称调用,dbt内置了四个通用测试。
编写测试是确认代码正常工作的最佳方式,同时也有助于避免代码更改时出现错误。dbt提供了两种测试方法,可以快速实现对数据异常值和数据集的字段属性进行数据质量检查。
singular test 异常值测试
编写查询校验失败数据的SQL是定义测试的最简单方法。这些测试被称为“异常值”测试,因为它们仅针对某个数据值进行校验。这些测试通常在项目的tests目录中定义在.sql文件中。可以使用Jinja模版语句(包括ref和source)。每个.sql文件包含一个select语句,并定义一个测试校验逻辑。
tests/assert_total_payment_amount_is_positive.sql
-- 退款金额为负数,因此总金额应始终>=0。 -- 因此,如果不是这样,则返回数据以使测试失败 select order_id, sum(amount) as total_amount from {{ ref('fct_payments' )}} group by 1 having not(total_amount >= 0)
此测试的名称是文件的名称:assert_total_payment_amount_is_positive
Generic tests通用测试
某些测试是通用的:它们可以反复使用。通用测试在测试块中定义,测试块包含参数化查询并接受参数。如下所示:
{% test not_null(model, column_name) %} select * from {{ model }} where {{ column_name }} is null {% endtest %}
代码中有两个参数:model和column_name。它们被模板化到查询中,这就是为什么测试可以在任意多的列和跨任意多的模型定义。dbt将会传递相应的model和column_name的值。通用测试一旦被定义,就可以将其添加为任何现有模型(或sources、seeds或snapshots)的属性。这些属性可以被添加到.yml文件中,该文件与其它资源模块位于同一目录中。
开箱即用,dbt附带了四个已经定义的通用测试:unique、not_null、accepted_value和relationships。以下是在订单模型上使用这些测试的完整示例:
version: 2 models: - name: orders columns: - name: order_id tests: - unique - not_null - name: status tests: - accepted_values: values: ['placed', 'shipped', 'completed', 'returned'] - name: customer_id tests: - relationships: to: ref('customers') field: id
这些测试含义为:
- unique:订单模型中的orderid列应该是唯一的
- not_null:订单模型中的order_id列不应包含null值
- accepted_values:订单中的status列应为“placed”、“shipped”、“completed”或“returned”之一
- relationships:订单模型中的每个customer_id都作为customers表中的一个id存在(也称为引用完整性)
在后台,dbt会使用通用测试块中的参数化查询来为每个测试构建一个Select查询。这些查询会返回校验判断不为真的行,如果测试返回零行,则校验通过。
例子
在项目中使用通用测试:
- 在模型目录中添加一个.yml文件,例如models/schema.yml,其中包含以下内容:
version: 2 models: - name: orders columns: - name: order_id tests: - unique - not_null
- 执行dbt test 命令:
$ dbt test Found 3 models, 2 tests, 0 snapshots, 0 analyses, 130 macros, 0 operations, 0 seed files, 0 sources 17:31:05 | Concurrency: 1 threads (target='learn') 17:31:05 | 17:31:05 | 1 of 2 START test not_null_order_order_id..................... [RUN] 17:31:06 | 1 of 2 PASS not_null_order_order_id........................... [PASS in 0.99s] 17:31:06 | 2 of 2 START test unique_order_order_id....................... [RUN] 17:31:07 | 2 of 2 PASS unique_order_order_id............................. [PASS in 0.79s] 17:31:07 | 17:31:07 | Finished running 2 tests in 7.17s. Completed successfully Done. PASS=2 WARN=0 ERROR=0 SKIP=0 TOTAL=2
保存测试失败结果
测试查询通常会在执行过程中统计校验失败的记录。如果设置了可选的–store-failures命令或store_failures配置,dbt会将测试查询的结果保存到数据库中的表中,然后查询该表以计算失败次数,这样可以在开发过程中更快地查询和检查失败记录。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/49901.html