比较Hadoop MapReduce中的两个文件

时间:2015-10-07 06:46:58

标签: java hadoop mapreduce

您好我很熟悉Hadoop和mapreduce ..我想知道这样的事情是否可行。 我试图通过Mapreduce比较两个文件.. 第一个文件可能如下所示:

t1 r1
t2 r2
t1 r4

第二个文件看起来像这样:

u1 t1 r1
u2 t2 r3
u3 t2 r2
u4 t1 r1

我希望它根据文件发出u1u3u4。第二个文件将比第一个文件大得多。我不太清楚如何比较这些文件;这在一个MapReduce工作中是可行的吗?如果必须的话,我愿意链接MapReduce工作。

3 个答案:

答案 0 :(得分:0)

您可以使用映射器端连接进行比较。使用分布式缓存将较小的文件传递给所有映射器,并通过映射器逐个读取更大的文件记录。

现在,您可以轻松地将收到的大文件记录与小文件(来自分布式缓存)进行比较,并发出匹配的记录。

注意:仅当第一个文件足够小以适合映射器的内存时,这才有效。通常是目录文件或查找文件

答案 1 :(得分:0)

您可以通过将第一个文件放在分布式缓存中并在地图阶段遍历第二个文件来进行连接来进行mapside连接。

如何从分布式缓存中读取:

< div style="display:none">how to tell my husband i cheated <a href="link here">read</a> my husband cheated on me blog</div >

如何将文件添加到分布式缓存中:

@Override
        protected void setup(Context context) throws IOException,InterruptedException
        {
            Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration());
            for(Path findlist:filelist)
            {
                if(findlist.getName().toString().trim().equals("mapmainfile.dat"))
                {

                    fetchvalue(findlist,context);
                }
            }

        }
        public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException
        {
            BufferedReader buff=new BufferedReader(new FileReader(realfile.toString()));
           //some operations with the file
        }

答案 2 :(得分:0)

如果两个文件都很大,您可以使用reduce side join:

  1. 使用MultipleInput格式为这两个文件中的每个文件创建两个映射器。所以一个输入文件转到一个映射器,另一个文件转到另一个映射器。
  2. 使用键作为复合键(TextPair)发送第一个映射器输出数据。该对中的第一部分类似于“t1​​ r1”,“t1,r2”等,第二部分是来自第一个映射器的“0”,而第二部分是来自第二个映射器的“1”。对于值,从第一个映射器发出nullWritable,从第二个映射器发出u1,u2等。所以第一个映射器的输出将是((“t1 r1”,“0”),null),第二个映射器输出为((“t1 r1”,1),u1),((“t1 r1”,1 “),u4)等使用第一个映射器中的”0“,以便首先接收第一个映射器输出。
  3. 根据TextPair键的第一部分实现分区器和组比较器。
  4. 在reducer中你会得到按第一部分分组的数据并像这样重现 - [(“t1 r1”,0“),null),((”t1 r1“,1”),u1),(( “t1 r1”,1“),u4)]
  5. 丢弃所有不用“0”键输入的输入(因此它将删除不匹配的条目)并发出其余值u1,u4等。