您的位置:首页 > 其它

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

2014-07-20 18:53 295 查看
有两个文件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
本文出自 “君子务本” 博客,请务必保留此出处http://youling87.blog.51cto.com/5271987/1440567
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: