您的位置 首页 > 数码极客

“如何对比2组数据一致性“如何验证数据一致性! excel如何对比数据一致性

前言

随着MySQL技术发展,通过垂直或水平拆分能够支持相当大的数据量,目前很多公司把SQLServer、Oracledb或其他数据库迁移到MySQL上,迁移数据量很大(数据库已经水平拆分成很多Shard),如何比较所有数据的一致性呢?

问题剖析

  1. 数据库迁移步骤:双写DB -> 数据一致性保证 -> 旧DB读流量逐步迁移到新DB -> 单写新DB -> 下线旧DB。迁移过程中问题很多,本章只给出数据已经同步到Hive,怎么校验Hive数据的一致性,线上一致性会在其他章节中给出。
  2. 问题是:迁移地表有成百上千张,如何比较每张表的每个字段的一致性呢?

实现思路

  • 思路:通过Job生成比较脚本,分发到调度系统,每天调度比较脚本,将比较不一致的结果存放到统计表中,通过报表平台将不一致日报发出,跟踪日报排查不一致问题,将问题反馈给大数据平台,让大数据平台解决不一致。
  • 统计表按天分区再按表分区d='2021-01-01',h=表名。
  • 大数据平台一致性校验可以校验出生产表的不一致和Hive同步的一致,前者需要开发排查解决,后者需要大数据平台解决。

实现思路

  • 表主键是orderid。

表主键是orderid


  • 表主键不是orderid而是联合主键。

  • UDF函数将所有业务字段拼接成string用于比较。

常见问题

  1. 时间日期类型Date、DateTime、Timestamp字段,SQL Server毫秒精度只到0,3,7结尾和MySQL不一致,需要对该类型截取处理,特别是业务字段是这样的类型是按需截取。
  2. Float,Double字段存在精度问题,如果两边不一致需要通过CAST函数转换后再比较。
  3. 对于带小数的字段,因SQL Server和MySQL报错的小数位不同,需要截取掉小数末尾的0后再比较。
  4. SQL Server的xml类型和MySQL的text类型存储了xml数据时前会将xml头(<?xml version="1.0"?>)去掉,要单独处理。
  5. 因两边数据同步时差,应排除掉当天的增量数据。
  6. 特殊Case处理:忽略非业务字段,非严格字段导致截取的字段。

附UDF函数

import org.a; /** * @Description:全量字段拼接 */ public class JointFieldsUdf extends UDF { public String evaluate(String... fields) { StringBuffer sb = new StringBuffer(); for (String item : fields) { if (item != null) { //去掉含小数点数字末尾的零 if (".") > -1) { ().replaceAll("(0)+$", "").replaceAll("\\.", "")).append("_"); } else { ()).append("_"); } } else { (item).append("_"); } } return ().substring(0, () - 1); } }

pom

<dependency> <groupId>org.a;/groupId> <artifactId>hive-exec</artifactId> <version>2.2.0</version> </dependency>

好经验分享给你,关注我学知识!

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何对比2组数据一致性,如何验证数据一致性,如何对比两组数据的一致性,excel如何对比数据一致性,如何保证数据的一致性”边界阅读