如何在hadoop中为各自的输入文件生成不同的输出文件

时间:2014-03-14 15:14:03

标签: java hadoop mapreduce

我使用了net中的标准wordcount示例,它将几个输入文件的输出提供给单个输出文件,但我只想将不同输入文件输出到各自不同的输出文件中。所以有任何方法可以在java中执行此操作。提前谢谢。

1 个答案:

答案 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。你可以在网上找到几个例子。

这应该让你去。