数据迁移一致性测试探索与实践

背景

量级庞大的日志通过mysql不足以支撑业务需求,以前通过任务调度定时跑批从mysql同步到hive存储,这种方式时效性为T+1,也就是说今天的日志,明天才能同步到hive,总而言之时效性不高。为了提高时效性,改为流式计算flink实时同步

  • 那么作为测试人员,我们如何保证切换同步方式后的数据正确性呢?通过对比新旧表数据是否一致显然是最简单的方法
  • 这次改动涉及600多张表,每一张表的字段数基本在千以上,甚至部分表字段数达万以上,面对如此庞大的数据量,通过人眼一个个去对比显然不太现实

探索与实践

方案一:sql脚本
SELECT column_names, COUNT(*) AS count_diff 
FROM (SELECT CONCAT_WS(',',A,B) FROM udc_test.s000 WHERE dt='20230814'UNION ALL SELECT CONCAT_WS(',',A,B) FROM test.s000 WHERE dt = '20230814' and rule_log_id in (select rule_log_id from udc_test.s000) 
) AS combined
GROUP BY column_names
HAVING COUNT(column_names) = 1select * from (select 'table1',A,B from udc_test.s000 WHERE dt='20230814' and rule_log_id in ('123456')union all select 'table2',A,B from test.s000 WHERE dt='20230814' and rule_log_id in ('123456')
)a order by a.table1 asc
方案二:python脚本
from pyhive import hive
from datetime import datetimeif __name__ == '__main__':#换成生产的连接conn = hive.Connection(host="xxx", port='xxx', auth="xxx", database='xxx', username='xxx',password='xxx')#这里换成需要比较的表名tableName1 = 'test.ssc_python_compare_fields1'tableName2 = 'test.ssc_python_compare_fields2'current_time = datetime.now()hash_code = str(hash(current_time))# 获取表结构query1 = 'desc ' + tableName1query2 = 'desc ' + tableName2cursor = conn.cursor()cursor.execute(query1)columns1 = [row[0] for row in cursor.fetchall()]cursor.execute(query2)columns2 = [row[0] for row in cursor.fetchall()]# 去除掉不需要比较的字段columns1.remove('# Partition Information')columns1.remove('# col_name')columns1.remove('dt')columns2.remove('# Partition Information')columns2.remove('# col_name')columns2.remove('dt')set1 = set(columns1)set2 = set(columns2)# 取出来表1特有的字段,可以保存到文件diffrence1 = set1 - set2print(diffrence1)# 取出来表2特有的字段,可以保存到文件diffrence2 = set2 - set1print(diffrence2)# 取表1和表2共有的字段,用于比较差异intersection = set1 & set2# 生成比较的sqlsql = 'select  'for element in intersection:sql = sql + 'if( nvl(t1.' + element + ',' + hash_code + ' )!= nvl( t2.' + element + ',' + hash_code + ') , \'no\',\'yes\') as ' + element + ' , '#print(sql)sql = sql[:-2]#print(sql)#sql中的dt可以改成具体需要比较的日期sql = sql + ' from ' + tableName1 + ' as t1 left join  ' + tableName2 \+ ' as t2  on  t1.rule_log_id=t2.rule_log_id ' \' and t1.dt= \'20230815\' and t2.dt = \'20230815\'  and t1.apply_type=t2.apply_type   where  'for element in intersection:sql = sql + ' t1.' + element + '!=t2.' + element + ' or 'sql = sql[:-3]print(sql)sql = sql + ' limit 1 '# 执行sql,获取到结果,如果两列不相等的话,值为no,相等的话值为yescursor.execute(sql)result = cursor.fetchone()# print(result)# 获取上述sql的元数据信息metadatas = cursor.descriptionprint('============================================================')# 遍历结果集,查找出比较结果不相同的数据,拿到列名index = 0while index < len(metadatas):if (result[index] != 'yes'):print(metadatas[index][0])index += 1print('============================================================')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【word技巧】word页眉,如何禁止他人修改?

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…

shell_42.Linux移动参数

移动参数 bash shell 工具箱中的另一件工具是 shift 命令&#xff0c;该命令可用于操作命令行参数。跟字面上的意思一样&#xff0c;shift 命令会根据命令行参数的相对位置进行移动。 在使用 shift 命令时&#xff0c;默认情况下会将每个位置的变量值都向左移动一个位置。因此&…

JVM内存耗尽应用卡死分析

一个应用程序卡死了&#xff0c;查看JVM内存耗尽了&#xff0c;该做些什么呢? &#xff08;1&#xff09;整体资源查看 top命令&#xff0c;查看内存、CPU使用情况是否有明显问题。 &#xff08;2&#xff09;查看网络连接数 netstat -an | wc -l &#xff08;3&#xff0…

bootstrap.properties中配置Nacos

bootstrap.properties用于在Spring Boot应用程序启动阶段加载外部配置 优先级高&#xff1a;在应用程序启动时首先加载&#xff0c;用于配置应用程序的基础设置&#xff0c;如配置数据源、日志、配置服务器 外部配置&#xff1a;加载外部配置源&#xff08;如远程配置服务器&a…

【代码规范】switch 块级的作用域问题

代码规范的一些事儿 问题 今日 Git 提交代码时&#xff0c;出现报错&#xff1a; error Unexpected lexical declaration in case block no-case-declarations 解决过程 我马上就去百度&#xff0c;就找到了这篇文章&#xff1a;解决 Unexpected lexical declaration in ca…

基于OpenAPI、freemarker动态生成swagger文档

前言 spring项目中可以使用springfox或者springdoc&#xff0c;通过写注解的方式生成swagger文档&#xff0c;下面介绍一种不写注解&#xff0c;动态生成swagger文档的方式&#xff0c;在某些场景会适用&#xff0c;例如接口是动态生成的&#xff0c;此时swagger就不能通过注解…

Qt中QFile、QByteArray QDataStream和QTextStream区别及示例

在Qt中&#xff0c;QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile&#xff1a; QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile&#xff0c;或者更方便地与QTextStream或QDataStream一起使用。 通常在…

Cookie和Session

前言扩展&#xff1a;笔者在之前学习前端扫盲阶段&#xff0c;写过一个简单易读的&#xff1a;表白墙项目&#xff0c;具体的前端代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta ht…

mac安装+配置python3环境

一、python3下载 官网下载 https://www.python.org/ 二、python3安装 打开下载好的.pkg文件一直继续确认即可。 三、验证是否安装成功 打开终端&#xff0c;输入python3&#xff0c;如果返回python对应的版本信息&#xff0c;则安装成功。 四、python配置 如果需要输入…

2023java攻克了抖音视频去水印视频下载

2023java攻克了抖音视频去水印视频下载 1、过滤链接 /*** 过滤链接&#xff0c;获取http连接地址* param url* return*/public static String decodeHttpUrl(String url) {int start url.indexOf("http");int end url.lastIndexOf("/");String decodeu…

基于卷积优化优化的BP神经网络(分类应用) - 附代码

基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于卷积优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.卷积优化优化BP神经网络3.1 BP神经网络参数设置3.2 卷积优化算法应用 4.测试结果…

flash-linear-attention CUDA算子成功实现(但限制极多。。)

在 C/DirectX着色器 的基础上速成CUDA编程&#xff0c;还好思维模式基本通用&#xff0c;就多了线程组排布和共享内存方面的东西&#xff0c;入门还行&#xff0c;高级加速方面就不太行了。 代码仓库&#xff1a;https://github.com/One-sixth/flash-linear-attention-pytorch…

Qt窗体设计的布局

本文介绍Qt窗体的布局。 Qt窗体的布局分为手动布局和自动布局&#xff0c;手动布局即靠手工排布各控件的位置。而自动布局则是根据选择的布局类型自动按此类型排布各控件的位置&#xff0c;使用起来比较方便&#xff0c;本文主要介绍Qt的自动布局。 1.垂直布局 垂直布局就是…

内核驱动模块分布编译

内核驱动模块代码 #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <linux/device.h> #include <linux/ioctl.h> #include <linux/cdev.…

Redis的开发利用

在Redis中&#xff0c;可以使用两个数据结构来实现阅读量和点赞量的计数。 1. 使用字符串来计数阅读量和点赞量 在Redis中&#xff0c;字符串类型的数据可以通过 INCR 和 DECR 命令来实现原子递增和递减。 例如&#xff0c;假设要对一篇文章进行阅读量统计&#xff0c;可以使…

基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …

mysql 查询表字段名,注释 , 以及sql拼接查询出的内容

#sql查询字段名&#xff0c;注释操作拼接 #查询字段名和注释 select COLUMN_NAME,COLUMN_COMMENT from information_schema.COLUMNS where table_name 表名 and table_schema 库名 order by ordinal_position #查询整个内容 select * from information_schema.COLUMNS wh…

adb 获取当前界面元素

adb配置正确&#xff0c;直接看6&#xff0c;pull的位置是你执行pull的目录下。 --------------------------------------------------------------------------------------------------------------------------------- 使用adb命令获取当前应用的元素需要先连接到手机或模…

义乌再次位列第一档!2022年跨境电商综试区评估结果揭晓!

义乌跨境电商综试区捷报频传&#xff0c;在商务部公布的“2022年跨境电子商务综合试验区评估”结果中&#xff0c;中国&#xff08;义乌&#xff09;跨境电子商务综合试验区&#xff08;以下简称&#xff1a;“跨境综试区”&#xff09;评估结果为成效明显&#xff0c;综合排名…

C语言获取文件长度

C语言获取文件长度 文章目录 C语言获取文件长度一、使用标准库方法二、使用Linux系统调用 一、使用标准库方法 #include <stdio.h>long get_file_size(const char * filename ){long size 0;FILE * fp fopen(filename,"rb");if( fp NULL ) {printf("o…