Deequ教程来监控Spark/Hive离线数仓的数据质量实用教程

devtools/2025/1/16 0:59:51/

第一部分:Deequ简介与环境搭建

1. Deequ是什么?

Deequ是AWS开源的一款基于Apache Spark的库,用于定义和验证数据质量规则。它通过声明式API允许用户定义一系列数据质量检查,并自动执行这些检查来评估数据集的质量,特别适合大数据处理场景,如Spark和Hive数据仓库。

2. 安装与配置
  • 依赖管理:在你的Spark项目中加入Deequ的依赖。如果你使用sbt,可以在build.sbt文件中添加如下依赖:Scala1libraryDependencies += "com.amazon.deequ" %% "deequ" % "latestVersion"其中latestVersion应替换为当前的稳定版本号。
  • 环境准备:确保你的开发环境已经安装并配置好了Apache Spark和相关依赖(如Hadoop客户端,如果使用Hive的话)。

第二部分:Deequ核心概念

1. 数据质量规则

Deequ支持多种数据质量检查,包括但不限于:

  • Completeness: 检查列是否完整(非空)。
  • Uniqueness: 确保列值唯一。
  • Domain Constraints: 检查数据是否符合特定域,如数值范围、正则表达式匹配等。
  • Size Constraints: 检查数据集大小是否在预期范围内。
  • Dependency Checks: 验证列间的关系,如引用完整性。
2. 声明式API

Deequ采用Scala的声明式API来定义数据质量规则,使得规则定义变得直观且易于维护。

第三部分:实战操作指南

1. 初始化Deequ

在SparkSession中初始化Deequ:

import com.amazon.deequ.analyzers._
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("Deequ Data Quality").getOrCreate()import spark.implicits._val analyzerContext = new AnalyzerContext(spark)
import com.amazon.deequ.analyzers._
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("Deequ Data Quality").getOrCreate()import spark.implicits._val analyzerContext = new AnalyzerContext(spark)
2. 定义数据质量检查

定义一套数据质量规则,例如检查某列是否非空且值唯一:

val checks = Seq(Completeness("column_name").isComplete, // 检查column_name列是否完整Uniqueness("unique_column").isUnique // 检查unique_column列是否唯一
)
val checks = Seq(Completeness("column_name").isComplete, // 检查column_name列是否完整Uniqueness("unique_column").isUnique // 检查unique_column列是否唯一
)
3. 执行数据质量检查

应用定义好的规则到数据集上:

val dataset = spark.read.parquet("path/to/your/dataset")val result = VerificationSuite().onData(dataset).addChecks(checks).run()
val dataset = spark.read.parquet("path/to/your/dataset")val result = VerificationSuite().onData(dataset).addChecks(checks).run()
4. 分析结果与报告

检查结果包含了每个规则的通过与否及具体详情,可以通过以下方式查看:

result.checkResults.foreach { case (check, checkResult) =>println(s"${check.description} --> ${checkResult.status}")
}
Scalaresult.checkResults.foreach { case (check, checkResult) =>println(s"${check.description} --> ${checkResult.status}")
}

Deequ还提供了生成HTML报告的功能,便于分享和存档:

result.writeReports("path/to/reports")

第四部分:高级用法与优化策略

1. 集成Hive
  • 使用Spark的Hive支持读取表数据:
  • val hiveDataset = spark.sql("SELECT * FROM your_hive_table")
2. 自定义检查与约束

Deequ允许用户自定义数据质量检查,以满足特定需求。

3. 性能优化
  • 分区处理:对于大型数据集,考虑按分区或子集处理数据。
  • 资源调整:根据Spark集群资源状况合理分配内存和CPU资源。

http://www.ppmy.cn/devtools/90528.html

相关文章

LLM之提示词工程

1.提示与提示工程 提示工程作为一门新兴的学科,专注于开发和优化提示技术,旨在提升语言模型(LMs)在各种应用与研究主题中的效能。掌握提示工程技能对于深入理解大型语言模型(LLMs)的潜力与局限至关重要。 研究人员借助提示工程,致力于增强LLM在广泛且复杂的任务(如问答…

js:两种将dom转为图片img的方式

js:两种将dom转为图片img的方式 一、使用 HTML2Canvas 库二、使用 Canvas 手动绘制 需求常出现场景: 生成截图导出图片可视化 一、使用 HTML2Canvas 库 html2canvas 是一个非常流行的 JavaScript 库,可以将 DOM 元素渲染为 Canvas&#xff0c…

01 计算机系统基础-2

操作系统 进程管理 进程管理是操作系统的核心,但如果设计不当,就会出现死锁的问题。如果一个进程在等待一件不可能发生的事,则进程就死锁了。而如果一个或多个进程产生死锁,就会造成系统死锁。基于死锁产生机制及解决方案&#…

python爬虫初识

一、什么互联网 互联网(Internet)是全球范围内最大的计算机网络,它将数以百万计的私人、公共、学术、商业和政府网络通过一系列标准通信协议(如TCP/IP)连接起来形成的一个庞大的国际网络。 互联网的起源可以追溯到196…

MySQL--读写分离与分布式存储

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、读写分离 1、什么是读写分离 在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两…

leetcode 2415.反转二叉树的奇数层

1.题目要求: 给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。 反转后,返回树的根节点。完美 二叉…

977. 有序数组的平方(双指针)

目录 一题目: 二:代码: 三:结果: 一题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 二:代码: class Solution…

力扣41【缺失的正数】

给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 class Solution {public int firstMissingPositive(int[] nums) {//将负数变成范围外的正数for(int i 0; i < nums.l…