繁体   English   中英

比较Hadoop MapReduce中的两个文件

[英]Compare two files in 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作业。

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

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

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

您可以通过将第一个文件放在分布式缓存中并在映射阶段遍历第二个文件来进行Mapside联接

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

@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
        }

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

DistributedCache.addCacheFile(new URI("/user/hduser`/test/mapmainfile.dat"),conf);`

如果两个文件都很大,则可以使用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. 在化简器中,您将获得按第一部分分组的数据并按如下方式接收它-[(“ t1 r1”,0“),null),((” t1 r1“,1”),u1),(((t1 r1 “,1”),u4)]
  5. 丢弃所有不带“ 0”键的输入(这样它将删除不匹配的条目)并发出其余值u1,u4等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM