Hadoop hdfs中的两个文件比较
我想写一个MapReduce来比较hdfs中的两个大文件。你有没有想过如何做到这一点。或者,因为文件大小非常大,所以如果有其他方法进行比较,那么思想地图缩减将是一种理想的方法。Hadoop hdfs中的两个文件比较,hadoop,mapreduce,Hadoop,Mapreduce,我想写一个MapReduce来比较hdfs中的两个大文件。你有没有想过如何做到这一点。或者,因为文件大小非常大,所以如果有其他方法进行比较,那么思想地图缩减将是一种理想的方法。 谢谢您的帮助。您可以通过两个步骤完成此操作 首先使行号成为文本文件的一部分: 假设初始文件如下所示: I am awesome He is my best friend 现在,将其转换为如下内容: 1,I am awesome 2,He is my best friend 这可以通过MapReduce作业本身或其他工
谢谢您的帮助。您可以通过两个步骤完成此操作
I am awesome
He is my best friend
现在,将其转换为如下内容:
1,I am awesome
2,He is my best friend
这可以通过MapReduce作业本身或其他工具来完成
二,。现在编写一个MapReduce步骤,其中在mapper中,行号作为键,实际句子的其余部分作为值。然后在reducer中比较这些值。当它不匹配时,输出行号(键)和有效负载,无论您在这里想要什么。此外,如果值的计数仅为1,则这也是不匹配的
编辑:更好的方法
更好的方法是,只需在映射器中发出一次读取的完整行作为键,并将值设为数字,例如1。因此,以我上面的示例为例,映射器输出如下:
< I am awesome,1 >
< He is my best friend,1 >
<我太棒了,1>
<他是我最好的朋友,1>
在reducer中,只需检查值的计数
,如果不是2,则表示不匹配
但是这种方法有一个缺点,如果有可能在两个不同的地方出现完全相同的行,那么不必检查reducer中给定键的值的长度,而应该将其检查为2的倍数。一个可能的解决方案是,在映射作业中将行号作为计数。
有两个文件,如下所示:
文件1:
我在这里,第一行
我很棒——第二行
你是我最好的朋友——第三行
文件2也是类似的类型
现在您的地图作业输出应该是这样的,
一旦完成了两个文件的映射作业,就有两条记录(key,value)要减少的值相同
在reduce时,您可以比较计数器或生成输出,依此类推。如果线路也存在于不同的位置,则输出可能不匹配,这表明该线路不匹配 我有一个比较文件和密钥的解决方案。在您的例子中,如果您知道您的ID是唯一的,那么您可以在映射中将ID作为键发出,将整个记录作为值发出。假设您的文件具有ID,Line1然后作为键和值从映射器发出
在洗牌和排序阶段,ID将被排序,您将获得一个迭代器,其中包含来自这两个文件的数据。即,来自两个具有相同ID的文件的记录将在同一迭代器中结束
然后在reducer中,比较迭代器中的两个值,如果它们匹配,则继续下一个记录。否则,如果它们不匹配,则将它们写入输出
我这样做了,效果很好
场景-没有匹配的键
如果两个文件之间没有匹配的ID,它们将只有一个迭代器值
场景2-重复密钥
如果文件有重复的键,迭代器将有2个以上的值
注意:仅当迭代器只有2个值时,才应比较这些值。
**提示:**迭代器的值不会总是按顺序排列。要识别特定文件中的值,请在映射器中的行末尾添加一个小指示器,如Line1;文件1
第1行;文件2
然后在reducer上,您将能够识别哪个值属于哪个映射器。您好,Amar,谢谢您的回复。但是我的文件有两个文件中都显示的项目ID。我需要比较两个ID是否相同以及它们对应的值。文件中有什么并不重要,对吗?你说的比较是指二进制比较,对吗?在你的文件中,你可以有一个id,而不是I awesome
,比如说1234456565
。我的意思是,假设我有这两个文件。文件1包含ID:1…。。身份证号码:2…。身份证号码:3…。文件2 ID:5…。。身份证号码:3…。ID:6…。现在进行比较。我需要首先匹配两个文件中的ID,然后进行比较。而且顺序也没有问题。做一件事,从你的两个文件中发布一个片段,并详细说明这个问题。我需要整理整行代码,它们以ID开头,在同一行中有几个其他值。