🗒️Hudi|数据质量校验
2023-5-23
| 2023-7-19
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
在数据仓库中,Write-Audit-Publish (WAP) 通常指的是数据流程的三个阶段,分别是:
  1. Write(写入):在这个阶段中,数据被写入到数据仓库中。这个阶段通常包括数据的提取(Extraction)、转换(Transformation)和加载(Loading)三个步骤,通常被称为 ETL 过程。在这个阶段中,数据需要经过清洗、整合、转换等处理,以便在后续的数据分析和处理中能够得到准确的结果。
  1. Audit(审核):在这个阶段中,数据被审核、校验和验证,以确保数据的准确性和可靠性。这个阶段通常包括数据质量检查、数据完整性检查、数据安全性检查等,以确保数据可以在后续的分析和应用中正确地使用。
  1. Publish(发布):在这个阶段中,数据被发布到数据仓库中供用户使用。这个阶段通常包括数据的存储、索引、查询等,以便用户可以方便地获取所需的数据。
WAP 流程在数据仓库中的作用是确保数据的质量和可靠性,避免数据错误或者误导分析结果的情况。通过分工合作,每个步骤的人员都能够发挥自己的专业能力,从而提高整个流程的效率和质量,达到最终的数据分析和应用目标。
从官网的这个文档[1],我们发现 Hudi 是支持数据质量校验的,那么实际上该怎么使用呢?其实现原理又是什么呢?这里验证一下。

如何使用

在 sql session 里通过 set 语法进行参数设置。需要设置下面两个参数:
其中:
  • hoodie.precommit.validators
设置了用于校验的类
  • hoodie.precommit.validators.single.value.sql.queries
设置了需要校验的 sql,用 # 号分割左右值,类似于 assert 断言。在这里设置了表的数据量 count 要等于 0。
注意:这里需要使用<TABLE_NAME>,而不是具体的表名,原因要在源码分析里跟踪。
接下来开始建表插入数据:
不出意外,遇到了这个报错:
说明质量校验不通过。
我们可以将 hoodie.precommit.validators.single.value.sql.queries 参数的 sql 设置成业务上的限制,比如某些列不能为空、某些列都在合适的范围里或者某些列汇总值固定等,从而保证我们数据库中的表一定是符合规范的。

源码实现

在 Hudi 写完数据,执行提交事务的阶段,进行了预校验。
在运行校验时,生成了提交事务前的数据集合 beforeState 和提交事务后的数据集合afterState 这两份数据集,并且通过 runValidatorAsync 进行异步校验。支持设置多个校验器。
我们配置的是 SqlQuerySingleResultPreCommitValidator 这个校验器,在 SqlQueryPreCommitValidator#validateRecordsBeforeAndAfter 里我们看到,将前后两个数据集注册成了两张临时表。
在 validateUsingQuery 里对传入的 sql 进行执行,对执行结果和传入的值进行比较判断是否符合质量要求。
通过 # 分割传入的语句,前面的字符串是需要运行的查询,后面的字符串是预期的结果。通过 spark 运行这个查询,比较是否符合预期,判断这次写入的数据是否合规,只有合规的数据才能被成功提交,否则需要回滚。
在上面的代码中,我们发现只对 commit 之后的临时表进行了表名替换,就是下面这行代码:
HoodiePreCommitValidatorConfig.VALIDATOR_TABLE_VARIABLE就是<TABLE_NAME>字符串。
如果没有配置<TABLE_NAME>而是直接填写表名,那么 queryWithNewSnapshot 这条 sql 就不会替换成临时表,但是因为这个事务并没有提交,所以直接查询原表是没有数据变化的,这样就没有办法对这批数据进行验证。
即下面这组 sql 例子(没有使用<TABLE_NAME>)是不会报错的:
 
参考资料:
  • Hudi
  • Hudi|查询加速Hudi|CDC实现分析
    Loading...
    目录