方法一:

 使用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,但效果差强人意,很慢