hdfs中的两个文件比较

时间:2013-02-20 17:44:16

标签: hadoop mapreduce

我想写一个map reduce来比较hdfs中的两个大文件。任何想法如何实现这一点。或者如果由于文件大小非常大而有其他方式进行比较,那么认为map-reduce将是一种理想的方法。 谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

您可以分两步完成此操作。

  1. 首先将行号作为文本文件的一部分:
  2. 说初始文件如下:

    I am awesome
    He is my best friend
    

    现在,将其转换为以下内容:

    1,I am awesome
    2,He is my best friend
    

    这可以通过MapReduce作业本身或其他工具来完成。

    2.现在编写一个MapReduce步骤,在mapper中将行号作为键,将实际句子的其余部分作为值。然后在reducer中只比较值。当它不匹配时会发出行号(密钥)和有效负载,无论你在这里想要什么。此外,如果values的计数仅为1,那么它也是不匹配的。

    编辑:更好的方法

    更好的是你可以做的是,只需在映射器中一次发出读取的完整行作为键,并将值设为数字,例如1.因此,以上面的示例为例,您的映射器输出如下: / p>

    < I am awesome,1 >
    
    < He is my best friend,1 >
    

    在reducer中只检查values的计数,如果不是2,则表示您不匹配。

    但是这种方法有一个问题,如果有可能在两个不同的地方出现完全相同的行,那么不应检查reducer中给定键的values长度,你应该检查它是2的倍数。

答案 1 :(得分:0)

一种可能的解决方案是,将行号作为地图作业中的计数。 有两个文件如下:

文件1: 我在这里 - 1号线 我太棒了 - 第2行 你是我最好的朋友 - 第3行

文件2也类似

现在你的地图作业输出应该是,&lt;我很棒,2&gt; ...

完成两个文件的Map作业后,您有两个具有相同值的记录(键,值)。

在缩小时,您可以比较计数器或生成输出,依此类推。如果该行存在于不同的位置,那么输出可能表明该行不匹配。

答案 2 :(得分:0)

我有一个比较文件和密钥的解决方案。在您的情况下,如果您知道您的ID是唯一的,您可以在地图中发出ID作为键,整个记录作为值。假设你的文件有ID,Line1然后作为键和mapper的值发出。

在随机播放和排序阶段,ID将被排序,您将获得一个包含两个文件数据的迭代器。即,来自具有相同ID的两个文件的记录将在同一个迭代器中结束。

然后在reducer中,比较迭代器中的两个值以及它们是否匹配继续下一个记录。否则,如果它们不匹配则将它们写入输出。

我做到了这一点,它就像一个魅力。

场景 - 没有匹配的密钥 如果两个文件之间没有匹配的ID,则它们只有一个迭代器值。

场景2 - 重复键 如果文件具有重复键,则迭代器将具有多于2个值。

注意:只有在迭代器只有2个值时才应比较这些值。 **提示:**迭代器始终没有值。要识别特定文件中的值,请在映射器中添加一个小指示符,如Line1; file1 线路1,文件2 然后在reducer上,您将能够识别哪个值属于哪个映射器。