请澄清
我有一组具有特定名称的输入文件(比如10)。我一次对所有文件运行字数统计工作(输入路径是文件夹)。我期待10个输出文件与输入文件同名。即应计算File1输入,并将其存储在具有“file1”名称的单独输出文件中。等等所有文件。
答案 0 :(得分:0)
您可以采取两种方法来实现多种输出
使用MultipleOutputs类 - 有关多列输出(https://hadoop.apache.org/docs/r2.6.3/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html)的信息,请参阅此文档,有关如何实现的更多信息,请参阅此http://appsintheopen.com/posts/44-map-reduce-multiple-outputs
另一种选择是使用LazyOuputFormat,但是,这与多输出结合使用,有关其实现的更多信息,请参阅此(https://ssmolen.wordpress.com/2014/07/09/hadoop-mapreduce-write-output-to-multiple-directories-depending-on-the-reduce-key/)。
我觉得将LazyOutputFormat与MultipleOuputs类结合使用是更好的方法。
答案 1 :(得分:0)
将reduce任务的数量设置为等于输入文件的数量。这也将创建给定数量的输出文件。
为每个地图输出键(word)添加文件前缀。例如,当你遇到“" cat"在文件名为" file0.txt"您可以发出密钥" 0_cat",或" file0_cat",或其他任何对" file0.txt"唯一的内容。使用上下文获取每次文件名。
覆盖默认的分区程序,以确保所有地图输出键的前缀为" 0 _"或" file0 _"将转到第一个分区,所有键都带有前缀" 1 _"或" file1 _"将进入第二个,等等。
在减速机中,删除" x _"或" filex _"输出键的前缀,并将其用作输出文件的名称(使用MultipleOutputs)。否则,如果您不想要MultipleOutputs,您可以通过检查分区程序代码轻松地在输出文件和输入文件之间进行映射。 (例如,part-00000将是分区0的输出)