上亿条数据,如何比对并发现两个表数据差异
目录
一、背景
二、分析流程
三、验数方法
3.1 数据量级比对
3.2 一致性比对
3.2.1 勾稽验证+md5方法
3.2.2 暴力比对法
3.3 差异数据发现
四、总结
本文是考拉验数(自动化验数)设计方案和实现中核心的验数SQL。
一、背景
做数据,经常遇到数据验证,很烦很枯燥,即耗时又耗人,但又必须去做。如何去做数据验证,并标准化整个流程,让验数变得轻松。
二、分析流程
……
相同表结构数据验证:比如修改表逻辑
相似表结构数据验证:比如修改表字段。
新表数据校验:比如新开发了表,选择一个比对表参考等等
三、验数方法
数据验证三步走:
- 数据量级比对:先比对两个表核心字段数据量级,如果量级不同,两个表数据肯定不一致。
- 一致性比对:如果量级相同,比对一致性。
- 差异数据发现:如果数据不一致,把不一致的数据打印出来。
3.1 数据量级比对
select left_table.pv-right_table.pv as pv_diff,left_table.user_id_uv - right_table.user_id_uv as user_id_uv_diff,left_table.order_id_uv - right_table.order_id_uv as order_id_uv_diff,left_table.city_id_uv - right_table.city_id_uv as city_id_uv_difffrom (select count(1) as pv,count(distinct user_id) as user_id_uv,count(distinct order_id) as order_id_uv,count(distinct city_id) as city_id_uvfrom mart_online.fact_user_order_daywhere dt=20190413)left_tableleft outer join (select count(1) as pv,count(distinct user_id) as user_id_uv,count(distinct order_id) as order_id_uv,count(distinct city_id) as city_id_uvfrom mart_test.fact_user_order_daywhere dt=20190413)right_tableon 1=1
左表pv减去右表pv值为:[0],核心字段uv差为:[0] 即两个表数据条数相同
+-------+----------------+------------------+---------------+
|pv_diff|user_id_uv_diff |order_id_uv_diff |city_id_uv_diff|
+-------+----------------+------------------+---------------+
| 0| 0| 0| 0|
+-------+----------------+------------------+---------------+
3.2 一致性比对
3.2.1 勾稽验证+md5方法
勾稽是一个小姑娘起的名字,在这里就是看一下左表不为NULL的left_table_num,右表不为NULL的right_table_num,两个表都有的 left_right_equal_num,如果这三个数相等就说明数据是一致的。反之数据肯定不一致,同时可以计算出不一致的条数。
md5:就是计算一行数据的md5值,把它当成key去做比对。尤其是在百亿数据规模的情况下,这种方法也使用。
************ 数据量一致性验证SQL ************* 注意:这里采用 full join
select sum(case when left_table.record_key is not null or left_table.record_key !='' then 1 else 0 end) as left_table_num,sum(case when right_table.record_key is not null or right_table.record_key !='' then 1 else 0 end) as right_table_num,sum(case when left_table.record_key = right_table.record_key then 1 else 0 end) as left_right_equal_numfrom (select md5(concat(if(user_id is null, '-', cast(user_id as string)),if(user_name is null, '-', cast(user_name as string)),if(order_id is null, '-', cast(order_id as string)),if(city_id is null, '-', cast(city_id as string)),if(city_name is null, '-', cast(city_name as string)),if(字段n…… is null, '-', cast(字段n…… as string)),if(dt is null, '-', cast(dt as string)))) as record_keyfrom mart_online.fact_user_order_daywhere dt=20190413)left_tablefull outer join (select md5(concat(if(user_id is null, '-', cast(user_id as string)),if(user_name is null, '-', cast(user_name as string)),if(order_id is null, '-', cast(order_id as string)),if(city_id is null, '-', cast(city_id as string)),if(city_name is null, '-', cast(city_name as string)),if(字段n…… is null, '-', cast(字段n…… as string)),if(dt is null, '-', cast(dt as string)))) as record_keyfrom mart_test.fact_user_order_daywhere dt=20190413)right_tableon left_table.record_key=right_table.record_key
************ 数据量一致性验证报表 *************
[left_table_num]左表中的数据条数,[right_table_num]右表中的条数,[left_right_equal_num]两个表中相等的数据条数。
左表中有[5660]条数据和右表不一致!
+--------------+---------------+--------------------+
|left_table_num|right_table_num|left_right_equal_num|
+--------------+---------------+--------------------+
| 16358699| 16358699| 16353039|
+--------------+---------------+--------------------+
3.2.2 暴力比对法
适合具有唯一ID的表,返回空说明验证准确。
select online.*,test.* from(select id,user_id,user_name,order_id,city_id,city_namefrom mart_online.fact_user_order_daywhere dt='20190413')onlineleft outer join (select id,user_id,user_name,order_id,city_id,city_namefrom mart_test.fact_user_order_daywhere dt='20190413') teston test.id=online.idwhere test.user_id!=online.user_idor test.user_name!=online.user_nameor test.order_id!=online.order_idor test.city_id!= online.city_idor test.city_name!= online.city_name
3.3 差异数据发现
发现差异数据的方法很多,这里只讲一个通用的方法:逐条比对法(假定两个表有唯一的ID,如果没有唯一ID,其实md5不一样的数据就不一致),这种方法适合小规模数据,当然我们真是实现的时候是结合一致性验证的情况,直接就能找到差异的数据并打印出来。
select left_table.*,right_table.*from (select *from mart_online.fact_user_order_daywhere dt=20190413)left_tablefull outer join (select *from mart_test.fact_user_order_daywhere dt=20190413)right_tableon left_table.id = right_table.idand left_table.dt = right_table.dtwhere COALESCE(left_table.user_id, 0) <> COALESCE(right_table.user_id, 0)or COALESCE(left_table.user_name, 0) <> COALESCE(right_table.user_name, 0)or COALESCE(left_table.order_id, 0) <> COALESCE(right_table.order_id, 0)or COALESCE(left_table.city_id, 0) <> COALESCE(right_table.city_id, 0)or COALESCE(left_table.city_name, 0) <> COALESCE(right_table.city_name, 0)or COALESCE(left_table.字段n……, 0) <> COALESCE(right_table.字段n……, 0)
不一致的条数:[5660],case如下表所示:
+-------+----------------+------------------+---------------+---------------+
|id |left_user_id |left_字段n…… |right_user_id |right_字段n…… |
+-------+----------------+------------------+---------------+---------------+
| 0| 1| 哇哈哈| 1| 养乐多|
+-------+----------------+------------------+---------------+---------------+
四、总结
如上验数SQL,可以通过代码封装,自动生成,就可以做成自动化数据验证的小工具了。真实情况比较复杂,要考虑字段的识别,where条件,两个表是否有唯一ID,没有唯一ID如何处理等等。
上亿条数据,如何比对并发现两个表数据差异相关推荐
- 程序员出售上亿条个人信息被刑拘
Java编程精选 点击右侧关注,免费入门到精通! 程序员头条 近日,深圳警方破获一宗侵犯公民个人信息案,缴获非法获取公民信息上亿条. 据新华社报道,9 月 18 日,深圳警方接到举报,称有人在网上非法 ...
- 一键发布消息到多个微博的服务器,“搞垮” 微博服务器?每天上亿条用户推送是如何做到的...
原标题:"搞垮" 微博服务器?每天上亿条用户推送是如何做到的 记者 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 想必国内绝大多数网民都有新浪微博的用户账号.据最 ...
- 上亿条个人信息被泄露 源头竟是房产商
抓获的犯罪嫌疑人 央视网 图 个人信息非法泄露已成社会公害.近日,西安警方就侦破了一起特大侵犯公民个人信息案件,查获的非法售卖个人信息有上亿条次,数量令人震惊. 这些个人信息主要包括陕西省内上千个住宅 ...
- 【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- mysql比对两张表数据
如何对两个数据库中的表进行比较 server 和mysql可以这样: insert A表(要插入的字段列表) select 要插入的字段列表 库2.B表 --注意字段的对应.... oracle ex ...
- mysql比对表中数据是否相同_如何用sql比较两张表数据是否一致?
在批量程序的测试中,经常会涉及到对数据库表的测试,今天我们来介绍一下用sql比较两张表结构相同的表数据是否完全一致的方法. 1.inner join 浅尝 提到比对两张表的数据是否完全相同,很容易想到 ...
- oracle比较两个表数据的差异
转自:https://zhidao.baidu.com/question/494572740.html 如有两张相同表结构的表: test表: test1表: 现在要找出两张表有差异的数据,需要用mi ...
- oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据
两张表数据如下: --2017年 id college score A001 北京大学 670 A002 中国人民大学 646 A003 清华大学 664 A003 清华大学 (定向) ...
- MySQL比较两个表数据差异,在t2表而不在t1表的数据
MySQL比较两个表数据差异,在t2表而不在t1表的数据 SELECT * FROM t2 WHERE id NOT IN (SELECT id FROM t1);
最新文章
- Windows8 Metro开发 (04) : 保存/读取本地应用程序设置
- 【Servlet】Request/Response/Cookie/Session中常用方法
- openresty + lua
- 短学期实训——第二篇
- 服务器 Font family [‘sans-serif‘] not found.Falling back to DejaVu Sans.解决办法
- Spark Java API:Transformation
- json.net java_java解析JSON (使用net.sf.json)
- CCIE理论-第七篇-SD-WAN网络(二)
- How to install JDK on Linux
- python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释
- Python入门--第三方模块的安装与使用,pip,import
- PHP报错 File:E:\\...\index\\controller\\Test.php Line(18) Illegal offset type in isset or empty
- MES系统是什么?MES系统的操作流程是怎样?
- 如何将网页保存为PDF文件
- 致那些徘徊在测试界的屌丝——也致给我自己这个苦逼屌丝
- 解决服务器内存被pc微信占满,微信占内存的解决方案终于出现了
- java protected 构造方法_Java中protected语义解释
- 线段树染色问题(例题为poj2777)
- win 10 安装时候无法格式化分区,错误 0x80070057
- Easypoi Excel导出和word导出带图片(图片不显示问题必须用字节)