Dbt自动化测试实战教程

数据团队关键核心资产是给消费者提供可信赖的数据。如果提供了不被信任的数据,那么支持决策智能依赖于猜测和直觉。原始数据从不同来源被摄取智数据仓库,数据产品团队有责任定义转换逻辑,将源数据整合到有意义的数据产品中,用于报告和分析。敏捷数据产品团队在将数据用于分析和决策制定之前,使用自动化的数据质量测试来检查他们提供数据的有效性。

在这篇博文中,我们将介绍如何使用dbt通过不同类型的测试探测数仓中存储的数据。我们假设您对如何设置dbt有基本的了解,并且您有一个正在工作的项目。如果没有,请查看这篇关于如何在dbt中设置项目的博客文章。

通常数据质量保证是通过在DW上采用SQL查询的测试规范来执行的。有不同类型的测试规范,例如内部和外部一致性检查、KPI验证或访问验证。我们还可以在结构级别上探测传入数据,例如,交付数据的模式是否与已知结构相对应。

dbt提供了多种测试实现方式,可以使用" dbt test "命令执行测试用例。下面我们分别进行说明。

单一测试模型

我们先来谈谈单一测试模型,我们需要定义返回记录的SQL语句,这些记录没有通过某个条件。它们在项目的tests目录中(dbt默认为“tests”)定义sql文件。例如,我们检查交易数据的税率是否为正数百分比值:

SELECT order_id
FROM {{ ref( ‘inb_transaction’) }}
WHERETaxPercent < 0

此测试将返回所有具有负税率的交易,便于用户进一步检查非期望测试结果。

顾名思义,单一测试意味着单个测试。如果您发现反复编写类似的单一测试是重复工作,那么是时候切换到通用测试了。一般来说,通用测试是接受参数的参数化查询。它们可以作为属性添加到.yml文件中的现有模型上。

通用测试

DBT附带了四个“开箱即用”的通用测试:unique、not_null、accepted_values和relationships。例如,你希望验证源表和目标表之间数据一致性。下面是一个检查order_id的例子:

version 2:models:- raw_transactionscolumns:- order_idtests:- relationships:to: ref('inb_transactions')field: order_id

第三方测试

除了dbt-core自带的4个测试之外,还有像dbt_expectations这样的包,它们扩展了dbt的测试功能。例如我们添加dbt_expectations测试用于检查shipping_date是否只包含date类型的值。

version 2:models:- raw_transactionscolumns:- order_idtests:- relationships:to: ref('inb_transactions')field: order_id- shipping_datetests:-  dbt_expectations.expect_column_values_to_be_of_type:column_type: date

知名dbt-utils包中也提供一些非常好用的测试方法,读者可阅读我的系列博文。

自定义宏测试

第三种选择是使用宏自定义宏测试。例如,我们可以将计算结果与来自不同分析的已知值进行比较。

在下面的示例代码中,我们计算去年的总营业额,并将其与年度报告中公布的值进行比较。这是典型的数据库回归测试,确保即使在进行了一些修改之后,数据库的完整性仍然保持不变。

{% test trx_sum_test(model, column_name, test_value, test_year) %}
WITH temp AS (SELECTSUM({{ column_name }}) AS trx_sumFROM{{ model }}WHEREEXTRACT(YEAR from RefDateTime) = {{ test_year }}
)
SELECT*
FROMtemp
WHEREtrx_sum != {{ test_value }}
{% endtest %}

然后将此测试添加到其他测试中:

version 2:models:- raw_transactionscolumns:- order_idtests:- relationships:to: ref('inb_transactions')field: order_id- shipping_datetests:-  dbt_expectations.expect_column_values_to_be_of_type:column_type: date- TransactionAmounttests:- trx_sum_test:test_value: 1000000test_year: 2021

测试分组

dbt 另一个有用的特性是使用tag标记对测试进行分组。请看示例:

version 2:models:- raw_transactionscolumns:- order_idtests:- relationships:to: ref('inb_transactions')field: order_idtags: ["test_group1"]- shipping_datetests:-  dbt_expectations.expect_column_values_to_be_of_type:column_type: datetags: ["test_group1"]- TransactionAmounttests:- trx_sum_test:test_value: 1000000test_year: 2021tags: ["test_group2"]

使用这些标记,可以在运行时选择要运行的特定测试。

示例 : dbt test——select tag:test_group1

总结

确保数据符合质量标准可能非常耗时,因为需要运行很多且计算成本高的测试。为了避免延迟向最终用户交付数据的工期,最好定义所谓的“冒烟测试”。这些测试很快,并且在使数据可访问之前运行,从而及时发现数据中可能存在的问题。更多细粒度的测试(可能需要一些时间才能完成)可以在加载之后进行,使用这种方法可以在上线时间和数据质量之间进行合理的权衡。

利用dbt的测试能力和特性,我们就拥有了数据质量保障工具。让我们及时发现数据质量问题,并确保在数据发布使用之前解决这些问题,最终基于可信的数据驱动决策。期待您的真诚反馈,更多内容请阅读数据分析工程专栏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中&#xff0c;我们常常会遇到一些看似合理实则错误的表达习惯。今天&#xff0c;我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先&#xff0c;我们需要明确&#xff0c;“double confi…

Springboot2笔记核心技术——1.基础入门

目录 1.spring和springboot的区别 1. 框架 vs. 工具 2. 配置方式 3. 启动方式 4. 项目结构 5. 生态系统 2.SpringBoot2入门 1. 创建项目 2. 项目结构 3. 编写主类 4. 添加Controller 5. 配置应用 6. 启动应用 7. 测试应用 8. 进一步学习 3.了解自动配置原理 1…

R 语言 | 取数据框一列子集时,如何保持数据框结构?drop=F

数据框取多列时&#xff0c;返回的还是数据框。 取一列时&#xff0c;默认退化为一个向量&#xff1a; > class(iris) [1] "data.frame" > t1iris[, 1:2] > class(t1) [1] "data.frame"> t2iris[,1] > class(t2) [1] "numeric" …

2.1 HuggingFists系统架构(二)

部署架构 上图为HuggingFists的部署架构。从架构图可知&#xff0c;HuggingFists主要分为服务器(Server)、计算节点(Node)以及数据库(Storage)三部分。这三部分可以分别部署在不同的机器上&#xff0c;以满足系统的性能需求。为部署方便&#xff0c;HuggingFists社区版将这三部…

YOLOv9改进,YOLOv9主干网络替换为GhostNetV2(华为提出的轻量化架构)

摘要 摘要:轻量级卷积神经网络(CNN)专为移动设备上的应用而设计,具有更快的推理速度。卷积操作只能在窗口区域内捕捉局部信息,这限制了性能的进一步提升。将自注意力引入卷积可以很好地捕捉全局信息,但会极大地拖累实际速度。本文提出了一种硬件友好的注意力机制(称为 D…

CSP-S 2024 提高级 第一轮(初赛) 完善程序(2)

【题目】 CSP-S 2024 提高级 第一轮&#xff08;初赛&#xff09; 完善程序&#xff08;2&#xff09; (2)&#xff08;次短路&#xff09;已知一个n个点m条边的有向图G&#xff0c;并且给定图中的两个点s和t&#xff0c;求次短路&#xff08;长度严格大于最短路的最短路径&am…

TFTP协议

目录 一、TFTP协议概述 1.1 TFTP协议简介 1.2 TFTP协议特点 二、TFTP协议原理 2.1 TFTP协议工作流程 2.2 TFTP协议数据包格式 三、TFTP协议应用场景 3.1 网络设备配置文件传输 3.2 虚拟机镜像文件传输 3.3 IoT设备固件升级 四、TFTP协议优化方法 4.1 增加超时重传机…

深入理解Python中的数据结构:OrderedDict

目录 1. 前言 2. OrderedDict的基本概念 2.1 OrderedDict的创建 2.2 排序特性 2.3 比较OrderedDict和标准字典 3. OrderedDict的高级功能 3.1 元素的移动 3.2 重新排序 3.3 反转顺序 4. OrderedDict的性能表现 4.1 插入性能测试 4.2 读取性能测试 5. OrderedDict的…

数据结构之——队列

一、队列概述 队列是一种操作受限的线性表&#xff0c;其限制条件为允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。插入的一端叫做队尾&#xff0c;删除的一端叫做队头。向队列中插入新元素的行为称为进队&#xff0c;从队列中删除元素的行为称为出队。例如军训的…

Java服务端开发中的API版本管理:从URI到Header的不同策略

Java服务端开发中的API版本管理&#xff1a;从URI到Header的不同策略 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java服务端开发中&#xff0c;API版本管理是一个重要而复杂的问题。随着业…

前端文件上传全过程

特别说明&#xff1a;ui框架使用的是蚂蚁的antd 这里主要是学习前端上传接口的传递参数包括前端上传之前对于代码的整理 一、第一步将前端页面画出来 源代码&#xff1a; /** 费用管理 - IT费用管理 - 费用数据上传 */ import { useState } from "react"; import {…

Leetcode 56.合并区间-Python

链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff…

【基础知识】网络套接字编程

套接字 IP地址 port&#xff08;端口号&#xff09; socket&#xff08;套接字&#xff09; socket常见API //创建套接字 int socket(int domain, int type, int protocol); //绑定端口 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //监听套接字…

Prometheus篇之利用promtool工具校验配置正确性

promtool工具 promtool是Prometheus的一个命令行工具&#xff0c;它提供了一些功能来帮助用户进行Prometheus配置文件&#xff08;如prometheus.yml&#xff09;的检查、规则检查和调试。 解释 promtool check config: 验证Prometheus配置文件的语法和设置。 promtool命令&…

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法 选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&a…

vue3常用的组件间通信

一 props props 可以实现父子组件通信&#xff0c;props数据是只读。 1. 基本用法 在父组件中&#xff0c;你可以这样传递 props&#xff1a; <template><ChildComponent message"Hello, Vue 3!" /> </template><script setup> import C…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)

情形如下&#xff1a;第一次启动运行一些正常&#xff0c;非正常关闭虚拟机&#xff0c;第二次启动虚拟机查看容器状态如下&#xff1a; docker nacos容器一切正常启动&#xff0c;但是就是无法访问web控制面板&#xff0c;访问无法连接。 首先&#xff1a;执行命令查看日志 …

设置元素浮动,出现高度塌陷导致鼠标无法点击

先贴代码片段&#xff1a; <div style"width: 30%; float: left;"><nz-input-group nzSearch [nzAddOnAfter]" suffixIconButton"><input type"text" nz-input placeholder"请输入实验名称" [(ngModel)]"q.name&…