SQL, 数据校验与 CRC,MD5

前几天,我们 SQL 大数据玩家微信群里,有朋友发布了一条数据校验的题目。觉得有趣,也有必要总结下,所以检索了些论文,结合平时工作中的使用,综合起来讲讲,看看自己能不能把这方面讲清楚

数据校验,常用在“数据搬运”的场景中。

比如,把数据从源头抽取到下游,抽取的过程中,可能还做了一系列的转换,没错这就是常说的ETL. 细心的小伙伴,一定会做好数据校验工作,即在源数据留下“指纹”。数据到了下游,对比下“指纹”,就能知道,有没有漏,有没有丢 ,或者有没有变异

再比如,两个组同时抽取一个数据源头做分析,在最终结果上,需要对比一致性,这也是数据校验。之前待过一家公司,财务部和营运部拿的都是ERP 数据,一个组用 Python 算,一个组用 SQL, 最后两组算出来的利润和成本完全不一致。月结会上,这两组人就经常因为数据问题而吵架

再举个例子,作为程序员,经常去 apache 下载一些开源软件,比如 spark

161ba06db734826fbe245c7019092f49.png

下载页面会有个 verify 的提示,意思也就是做下软件的数据校验,防止网络丢包,或者文件损坏,被调包等等现象发生

要解决上面这些数据校验需求,我有三个方法:

第一,集合对比

第二,哈希

第三,随帧校验码

95d7c9f46459cc7f198fb455fbf4384e.png

集合对比

这是小数据场景最合适的利刃。

举个例子,在数据仓库中,用户表一定不陌生。它的数量级不会很大,通常上万或者十万左右。对它做数据校验时,使用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 入门的朋友,都能写出来。但用在哪里,就考验平时对场景的理解了。这其中的细节,要躺平的坑,就不多说了,朋友们平时自己多积累了。

bb07334e8def262426d65a7d38b4fcf7.png

哈希

第一种方法,简单粗暴,见效很快。针对小数据量级,非常高效。但要处理起百万级数据,就会差点意思。

接下来要介绍的算法,更高效,它就是哈希。

数据库厂商都实现了自己的哈希(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) AS row_checksum
 FROM dbo.user_source

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值