方法一:
使用java编程,读取文件 逐行对比,但每行都要和另一个文件的所有行做对比,复杂度 m*n
方法二:
linux命令是否有可以实现?grep就可以,缺点是完全匹配,没有因为结构化数据字段顺序的不同而去做匹配
grep的几个参数说明
-v反向查找,即获取没有匹配到的
模式选择regex pattern的不同,具体区别有机会可以多试试
-f obtain PATTERN from FILE
-F PATTERN is a set of newline-separated strings
-w, --word-regexp force PATTERN to match only whole words
-x, --line-regexp force PATTERN to match only whole lines
示例:
$ grep -xf a2.txt a1.txt // 获取匹配到的记录 (inner join)
$ grep -xvf a2.txt a1.txt // 反向匹配,即只提取a1.txt才有的内容,两个文件参数位置倒换一下就获取到了a2.txt独有的内容
方法三:
数据是结构化形式,所以将文件统一放在一个工具里实现,mysql,这样就是2个表:
1可以各自只有一列,这样就直接join连接比较
2因为是结构化,可以存为多个字段,这样即便2个文件的存储时列顺序不同也可以实现比较
方式三:
spark读取方式。通过spark-shell.sh --master loca[5] val s=spark.read.schema(schema).json("file:///tmp/c1.json")
注意:这里没有通过yarn方式去比较,我试过了同样的方式读取上面的s,虽然不报错,但是也没有内容,不是schema定义不对,就是yarn方式client可能不支持吧,具体原因未知
方式四:
使用excel的vlookup,我昨天尝试对比不到3000的数据量,它的执行开启了4个线程,还是有些慢的,而且通过匹配后还要进行筛选,因为是双向比较,这种操作要执行2遍,而且我的excel不知道怎么回事,使用vlookup,在wps可以,在excel就语法错误,也是很郁闷了
关于这个需求,我的2个数据,一个在hadoop上,一个在本地服务器,且结构化参数的顺序不同,我将hadoop上的拿到了本地服务器,然后通过再将这2个文件分别通过spark读取本地文件,分别获取后再做的比较,最终将差异数据存到了mysql
另外还有一个需求,一份数据在excel,一份在mysql,这次还简单一些,只有一列数据,我统一放在了excel上,通过vlookup做的比较,虽然只有不到3000,但效果差强人意,很慢