两个大文件,比较这两个大文件的差异

有两个文件A和B,分别保存了一个系统两天的数据快照。 
a.txt 
(格式为:号码,姓名,年龄,姓别,状态) 
13900001111,小A,20,男,01 
13900001112,小H,20,女,06 
13900001113,小C,20,男,06 
13900001114,小D,20,男,04 
13900001116,小E,20,女,04 
13900001118,小F,20,男,04 
13900001119,小G,20,女,07

b.txt 
(格式和a一样:号码,姓名,年龄,姓别,状态) 
13900001111,小A,20,男,01 
13900001113,小C,20,男,06 
13900001114,小D,20,男,04 
13900001116,小E,20,女,04 
13900001118,小F,20,男,04 
13900001119,小G,20,女,01 
13900001120,小K,23,女,01

b文件比a多了一个“小K”,但是少了一个“小H”,另外“小G”的状态被改为“01”,两个文件的号码都是唯一标识。 
我想达到的目的是 
1、想快速的在B文件中找出对比A少的记录和多出来的记录。 
2、找出B文件中状态被修改的记录 
例子里面的数据量比较少,实际上a文件和b文件都在4-5千万的数量级别。

强调这两个文件加起来的数据有上亿条,估计导入到数据库都要很长时间。 
现在的限制最多在2个小时以内完成对比,并输出相关的结果

----------------------------------------------------------------------------------------------------------------------------------------------

题目大抵如此,下面是我收集的几个解决问题的思路:

其实这里看到两个文件中的每行还是有此行对应的id的(就是说如果两个文件都有这个行id的存在,那么我们可以认为这两个文件中的两行其实是一行),这样其实我们就可以把问题转换为一个多表join的问题,这样思考岂不是简单多了。

下面我用不多的文字简述一下这个问题用mapreduce解决的过程(当然其实这里如果不用mapreduce,用hash(行id)的数值把文件切分成1w个,然后两边的hash()相同的文件做一下对比原理也是一样的)

map函数的大致处理过程:

解析一行

将context.collect(行id,line+",flag");//这里的flag指示出当前这一行出自哪个文件

reduce函数中的处理过程:

if(values.length>1){

if(values.length){

flag0 = getFlag(values[0]);

flag1 = getFlag(values[1]);

if(flag0 ==a&&flag1 ==b){

avalue=values[0]

bvalue=values[1]

context.write(key,"b文件发生修改,bvalue["+bvalue+"],avalue["+avalue+"]");

}else if(flag0 ==b&&flag1 ==a){

avalue=values[0]

bvalue=values[1]

context.write(key,"b文件发生修改,bvalue["+bvalue+"],avalue["+avalue+"]");

}//其余情况暂不处理

}//这里先不处理一个行id在一个文件中出现多次的情况

}else if(values.length==1){

flag = getFlag(values[0]);

if(flag==a){

context.write(key,"b 文件删除了"+key);

}

if(flag==b){

context.write(key,"b 文件添加了"+key);

}

}

return ;

ps:记得设置parationer和sortcomparetor

时间: 2024-07-30 19:59:45

两个大文件,比较这两个大文件的差异的相关文章

java文件读写的两种方式

今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOException { io(); buffer(); } /** * 以流的形式读写 可以使用任何文件 特别是二进制文件 * * @author hh * @date 2014-12-11 * @throws IOException */ public static void io() throws IOExce

第六篇、文件处理之文件修改的两种方式

目录 第六篇.文件处理之文件修改的两种方式 说明 方式一 方式二 总结 第六篇.文件处理之文件修改的两种方式 说明 文件的数据是存放在硬盘上的,所以只能覆盖,不能直接修改,平时看到的修改文件都是障眼法的效果,具体的两种实现方式 方式一 将硬盘里的文件全部加载到内存里,内存是可以直接修改的,修改完了后,再由内存覆盖到硬盘里 import os with open('37r.txt') as fr, open('37r_swap.txt', 'w') as fw: data = fr.read()

自动创建文件夹的两种方法

自动创建文件夹的两种方法 1.CreateDictionary() CreateDirectory(myPath, 0); //在临时文件夹中创建本应用的文件夹 原型为:BOOL WINAPI CreateDirectory(__in  LPCTSTR lpPathName, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes); 其中lpPathName是要创建的目录的路径,第2个涉及安全性问题 传NULL就好了 例如: char path[MAX_

转载:删除github上文件夹的两种方式

http://www.jianshu.com/p/286be61bb9b8 删除github上文件夹的两种方式(解决已经加入ignore的文件夹无法从远程仓库删除的问题) 如果此文件夹已被加入git追踪,那么删除方法很简单,只需要将此文件夹删掉,然后提交一下就可以了如果次文件夹曾经被加入过git追踪,现在被加入.gitignore里了,但是github上还有此文件夹.对于这种情况,稍微有点复杂,因为已经加入.gitignore的文件或文件夹,无法对其进行提交了,哪怕是将其删除,都无法提交.我们用

自制按钮图标的两种方法: image sprite和svg字体文件

用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具,可以上传自己的SVG格式的图标文件,也可以从其中选择已有的图标, 定制出自己的字体文件.下载的结果包括了字体文件和一个简单的demo.html, (https://icomoon.io/app/#/select), (类似工具: https://glyphter.com) 二.用 image spr

两套Ext小图标(含CSS样式文件)--约2000个图标

在Ext项目开发中经常用到16X16 的小图标,今天为大家准备被了两套完美的图标和样式,各大概包含2000个图标. 下载地址:http://files.cnblogs.com/zhougaojun/Ext%E5%B0%8F%E5%9B%BE%E6%A0%87.zip 部分图标效果: (1)第一套图标样式 (2)第二套图标样式 两套Ext小图标(含CSS样式文件)--约2000个图标,布布扣,bubuko.com

linux下用scp命令在两个服务器之间传输文件,利用php_scp函数进行文件传输

在linux下利用scp进行文件传输, 从服务器下载文件 scp [email protected]:/path/filename /path/filename 上传本地文件到服务器 scp /path/filename [email protected]:/path/filename 从服务器下载整个目录 scp -r [email protected]:remote_dir/ /path/ 上传目录到服务器       scp -r /dir [email protected]:remote

今日原香嘉苑恒大御景湾两自住房开始摇号

今日原香嘉苑恒大御景湾两自住房开始摇号 行业动态腾讯房产2014-10-11 06:14 我要分享 1 今天起,房山首个自住房项目——原香嘉苑自住房项目和朝阳的恒大御景湾自住房项目都将开始摇号. 恒大御景湾自住房项目,将于今天上午10点半在该项目售楼处进行摇号.该项目房源套数共有1573套.最终确认申购家庭为65404户,通过购房资格审核的家庭共62888户,其中,优先家庭共51656户,非优先家庭11232户. 中国铁建原香嘉苑自住房项目将于今天下午2点摇号.该项目最终确认申购家庭为21537

startActivity(intent); 启动 类文件出现 返回两次才可以到上级界面纠结

Intent intent = new Intent(); intent.setClass(School.this, Setting.class); startActivity(intent); 在纠结这个问题的时候也在考虑 是不是 .setClass 函数是否 前面个参数是设置 起始对象 startActivity(intent); 启动 类文件出现 返回两次才可以到上级界面纠结

Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Simple