我使用了net中的标准wordcount示例,它将几个输入文件的输出提供给单个输出文件,但我只想将不同输入文件输出到各自不同的输出文件中。所以有任何方法可以在java中执行此操作。提前谢谢。
答案 0 :(得分:0)
您可以通过以下方式处理该要求: - 在Mapper中获取文件名并不容易,但可以实现。通过映射器中的以下代码:
Path inputPath = null;
InputSplit inputSplit = reporter.getInputSplit();
String name = inputSplit.getClass().getName();
if ("org.apache.hadoop.mapred.FileSplit".compareTo(name) == 0) {
FileSplit fs = (FileSplit) inputSplit;
inputPath = fs.getPath();
}
if ("org.apache.hadoop.mapred.lib.TaggedInputSplit".compareTo(name) == 0) {
TaggedInputSplit tis = (TaggedInputSplit) inputSplit;
InputSplit iis = tis.getInputSplit();
String iname = iis.getClass().getName();
if ("org.apache.hadoop.mapred.FileSplit".compareTo(iname) == 0) {
FileSplit fs = (FileSplit) iis;
inputPath = fs.getPath();
}
}
现在将文件名添加到Map输出键。因此,您的地图输出键可以是以下之一: - 具有2个字段的复杂可写 - 文件名和&来自mapper的单词 或者只是带有2个组件的连锁键的文本 - 文件名和文件名。来自mapper的单词
现在您需要一个自定义分区&比较器把它分成diff redurs,所以每个文件名都转到diff reducer,同一个文件中的同一个字转到同一个reducer。你可以在网上找到几个例子。
这应该让你去。