前几天,我们 SQL 大数据玩家微信群里,有朋友发布了一条数据校验的题目。觉得有趣,也有必要总结下,所以检索了些论文,结合平时工作中的使用,综合起来讲讲,看看自己能不能把这方面讲清楚
数据校验,常用在“数据搬运”的场景中。
比如,把数据从源头抽取到下游,抽取的过程中,可能还做了一系列的转换,没错这就是常说的ETL. 细心的小伙伴,一定会做好数据校验工作,即在源数据留下“指纹”。数据到了下游,对比下“指纹”,就能知道,有没有漏,有没有丢 ,或者有没有变异
再比如,两个组同时抽取一个数据源头做分析,在最终结果上,需要对比一致性,这也是数据校验。之前待过一家公司,财务部和营运部拿的都是ERP 数据,一个组用 Python 算,一个组用 SQL, 最后两组算出来的利润和成本完全不一致。月结会上,这两组人就经常因为数据问题而吵架
再举个例子,作为程序员,经常去 apache 下载一些开源软件,比如 spark
下载页面会有个 verify 的提示,意思也就是做下软件的数据校验,防止网络丢包,或者文件损坏,被调包等等现象发生
要解决上面这些数据校验需求,我有三个方法:
第一,集合对比
第二,哈希
第三,随帧校验码
集合对比
这是小数据场景最合适的利刃。
举个例子,在数据仓库中,用户表一定不陌生。它的数量级不会很大,通常上万或者十万左右。对它做数据校验时,使用SQL的 Except 就可以了。
假设,有两张用户表,一张来自源数据库,user_source;一张是数据仓库表 user_target. 怎么判断两表的数据差异呢,最简单的方法用 except
SELECT USER_ID,USER_NAME
FROM user_source
EXCEPT
SELECT USER_ID,USER_NAME
FROM user_target
我想,只要SQL 入门的朋友,都能写出来。但用在哪里,就考验平时对场景的理解了。这其中的细节,要躺平的坑,就不多说了,朋友们平时自己多积累了。
哈希
第一种方法,简单粗暴,见效很快。针对小数据量级,非常高效。但要处理起百万级数据,就会差点意思。
接下来要介绍的算法,更高效,它就是哈希。
数据库厂商都实现了自己的哈希(Hash)函数,通过查询文档,这不难掌握。比如:
SQL Server 有 Checksum, Binary_Checksum, HashBytes;
Oracle 有 Ora_Hash.
以下是 SQL Server T-SQL 的 checksum 用例
-- T-SQL Demo
SELECT user_id
, user_full_name
, checksum(user_id,user_full_name