2013-02-20 41 views
1

我想写一个map reduce来比较hdfs中的两个大文件。任何想法如何实现这一点。或者,如果还有其他方法可以进行比较,因为文件大小非常大,所以认为map-reduce会是一个理想的方法。 感谢您的帮助。hdfs中的两个文件比较

回答

0

您可以通过2个步骤完成此操作。

  1. 首先使线数为文本文件的部分:

说最初的文件看起来像:

I am awesome 
He is my best friend 

现在,将它转换为是这样的:

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

这很可能是由MapReduce作业本身或其他工具完成的。

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

编辑:更好的方法

更妙的是你可以做的是,刚刚发出的映射为重点,一次读取的完整产品线,使值的号码的,说1。所以把我的例如上述的映射器输出将如下所示:

< I am awesome,1 > 

< He is my best friend,1 > 

而在减速只是检查计数的values,如果不是2,你有一个不匹配。

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

+0

嗨阿马尔,感谢您的回应。但我的文件具有出现在两个文件中的项目ID。我需要比较两个id是否相同以及它们的相应值。 – NewJavaBee 2013-02-20 18:50:36

+0

文件中有什么并不重要,对吧?通过比较你的意思是二进制比较,对吗?在你的文件中,你可能有一个ID,比如'1234456565',而不是'我很棒'。 – Amar 2013-02-20 18:53:29

+0

我的意思是说,假设我有这两个文件。文件1包含 ID:1 ... .. ID:2 ...。 ID:3 ...。 文件2 ID:5 ... .. ID:3 ...。 ID:6 ...。 现在进行此比较。我需要首先匹配两个文件中的ID,而不是比较。并没有哼哼。 – NewJavaBee 2013-02-20 18:54:29

0

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

文件1: 我在这里--line 1 我真棒 - 2号线 你是我最好的朋友 - 3号线

文件2也类似种类

现在,您的地图作业输出应该是这样的,<我真棒,2> ...

一旦你与这两个文件的地图完成任务,你有两个记录(键,值)具有相同的其价值减少。

在缩小时,您可以比较计数器或生成输出,等等。如果该线路在不同位置存在,则可能是表示该线路不匹配。

0

我有一个比较文件与键的解决方案。在你的情况下,如果你知道你的ID是唯一的,你可以在地图上发出ID作为键,整个记录作为值。让我们说你的文件有ID,Line1然后作为ke​​y和mapper的值发出。

在洗牌和排序阶段,该ID的将被排序,你会得到来自这两个文件的数据的迭代器。即,来自两个具有相同ID的文件的记录将以相同的迭代器结束。

然后在减速,从迭代器比较这两个值,如果他们匹配下一条记录继续前进。否则,如果它们不匹配,则将它们写入输出。

我已经做到了这一点,它的工作就像一个魅力。

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

方案2 - 重复键 如果文件有重复键,迭代器都将有2倍以上的值。

注意:只有当迭代器只有2个值时,才应该比较这些值。 **提示:**迭代器不会始终有值。 file1的 线路1;为了识别从特定文件中的值,在映射器在像线路1行的末尾添加一个小的指示器file2的 然后在减速器你将能够识别哪个值属于哪个映射器。