使用md5与checksum快速数据校验方法(mysql、es、hbase通用)

校验原理

  1. 将每条数据需要比对的字段拼接成为字符串,字段顺序需要一致
  2. 使用md5摘要算法对字符串进行转换,生产该条数据的checksum,大多数情况checksum会比原始字符串短,便于使用
  3. 百万数据建议使用聚合比对转步骤4,不使用聚合直接转步骤6
  4. 对多条数据进行聚合,生成对对应checksum,用于批量数据校验,加快校验速度。
  5. 比对不同数据源中的聚合checksum,找出不一样的批次
  6. 逐条比对(不一致批次内的)每一条记录的checksum,找出不一致的数据
  7. 对不一致的数据进行同步处理

数据行checksum

  1. 使用concat函数将需要比对字符串拼接成checkString
  2. 使用ifnull函数,因为当数据为null时,concat不生效
  3. 使用md5函数生成摘要字符串,即checksum
SELECT
	id userId,
	username,
	phone,
	sex,
	CONCAT(
		IFNULL( username, '' ),
		IFNULL( phone, '' ),
		IFNULL( sex, '' ) 
	) check_str,
	MD5(
		CONCAT(
			IFNULL( username, '' ),
			IFNULL( phone, '' ),
			IFNULL( sex, '' ) 
		)) check_sum 
FROM
	t_user;

  • 字段拼接小技巧,快速获取字段的拼接sql
SELECT
	GROUP_CONCAT( 'IFNULL(', COLUMN_NAME, ','''')' ) 
FROM
	information_schema.COLUMNS 
WHERE
	TABLE_NAME = 't_user';

聚合checksum

  • 按照id大小进行分组统计
  • 对单条checksum生成分组聚合的checksum
  • 显示每组的最大最小id和记录数,便于比对和后续处理。
  • 使用div进行分组,根据数据量多少进行调整
  • 如果数据量百亿,可以按照该方法进行多级聚合。

	
	SELECT
	min( id ) AS minId,
	max( id ) AS maxId,
	count( 1 ) AS rowCount,
	MD5(
		GROUP_CONCAT(
			MD5(
				CONCAT(
			IFNULL( username, '' ),
			IFNULL( phone, '' ),
			IFNULL( sex, '' ) 
		)) 
		ORDER BY
			id 
		)) AS check_sum
FROM
	t_user 
GROUP BY
	(
	id DIV 1000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lizz666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值