我想写一个map reduce来比较hdfs中的两个大文件。任何想法如何实现这一点。或者如果由于文件大小非常大而有其他方式进行比较,那么认为map-reduce将是一种理想的方法。 谢谢你的帮助。
答案 0 :(得分:0)
您可以分两步完成此操作。
说初始文件如下:
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上,您将能够识别哪个值属于哪个映射器。