有两个文件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