我正在尝试实现一个Mapreduce程序,从2个文件中进行wordcounts,然后比较这些文件中的单词计数,看看哪些是最常用的单词......
我注意到在为文件1执行wordcount后,进入目录“/ data / output1 /”的结果,里面有3个文件。 - “_成功” - “_logs” - “part-r-00000” “part-r-00000”是包含file1 wordcount结果的文件。如果文件名是在事先知道文件名的情况下实时生成的,我如何让我的程序读取该特定文件?
此外,对于(键,值)对,我在“值”中添加了一个标识符,以便能够识别该字所属的文件和计数。
public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
Text newValue = new Text();
newValue.set(value.toString() + "_f2");
context.write(key, newValue);
}
在稍后阶段,如何“删除”标识符,以便我可以获得“价值”?
答案 0 :(得分:3)
将您的下一个MR作业指向/ data / output1 /。它将读取所有三个文件作为输入,但_SUCCESS和_logs都是空的,因此它们对您的程序没有任何影响。它们只是以这种方式编写,以便您可以告诉写入目录的MR作业已成功完成。
答案 1 :(得分:1)
如果您想从2个不同的文件中实现字数,那么您可以使用multipleinput类,您可以在其中同时对两个文件应用map reduce程序。请参考此链接以获取如何实现它的示例http://www.hadooptpoint.com/hadoop-multiple-input-files-example-in-mapreduce/在这里您将为每个输入文件定义单独的映射器,因此您可以在两个映射器文件中添加不同的标识符,然后当输出将转到reducer时它可以识别从哪个输入来自的地图文件,可以相应地处理它。您可以像添加它们一样删除标识符,例如,如果在mapper 1输出键中添加前缀@,在mapper 2输出键中添加#,那么在reducer中,您可以使用此前缀识别来自哪个地图输入,然后您可以在reducer中简单地删除此前缀。
除了关于与文件读取有关的其他查询之外,输出文件名远远有一个模式,如果你正在使用hadoop1.x,那么结果将存储在文件名中作为part-00000及以后的版本hadoop 2.x结果将存储在文件名part-r-00000中,如果有另一个输出需要在同一输出路径中写入,那么它将存储在part-r-00001及之后。生成的其他两个文件对于开发人员来说没有任何意义,他们更像是hadoop本身的一半
希望这可以解决您的疑问。如果答案不明确,请发表评论。