如何为hadoop输出文件提供自定义名称

时间:2012-01-17 20:45:33

标签: hadoop

我希望输出文件的格式为2012117-part-r-00000。基本上我希望输出文件附加日期,以便我可以根据日期排列文件。我查看了OutputFormat和FileOutputFormat,但它对我的情况没有帮助。

5 个答案:

答案 0 :(得分:5)

MR作业的输出文件名没有太大的灵活性。使用MultipleOutputFormat的子类。

必须实现MultipleOutputFormat#generateFileNameForKeyValue方法,忽略此方法的输入并返回date + -part-r- + mapred.task.partition模式中的字符串。 mapred.task.partition是一个int,所以它必须预先用0填充。

答案 1 :(得分:5)

我刚刚找到了新的API,我可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs和方法addNamedOutput()

答案 2 :(得分:4)

有两种方法可以更改输出文件名。

1。使用Java类MultipleOutputFormat。

// job.setOutputFormatClass(TextOutputFormat.class);
LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);
MultipleOutputs.addNamedOutput(job,“20180318”, TextOutputFormat.class, Text.class, IntWritable.class);

2。使用

job.getConfiguration().set(“mapreduce.output.basename”, “20180318”);

参考链接:http://data-flair.training/forums/topic/in-mapreduce-how-to-change-the-name-of-output-file-from-part-r-00000

答案 3 :(得分:1)

可以通过在Mapper / Reducer类中使用多输出格式来实现。例如:

import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;

在Mapper / Reducer类中创建MultipleOutputs的对象。

private MultipleOutputs<Text, NullWritable> _multipleOutputs;

在设置中,您可以执行以下操作:

_multipleOutputs = new MultipleOutputs<Text, NullWritable>(context);

然后,在map / reduce方法中,您可以执行以下操作:

_multipleOutputs.write(new Text(whatever you want to emit),new Text(whatever you want to emit),"xyz-m");

这将为您提供xyz-m-00000等文件名。

答案 4 :(得分:0)

如果要在输出文件后附加日期,请使用 MultipleOutputs Apache Hadoop

以下是使您熟悉的示例代码:

MultipleOutputs<Text, Text> mos;

@Override
public void setup(Context context) {
    mos = new MultipleOutputs(context);
}

private IntWritable totalCommits = new IntWritable();

@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context)
        throws IOException, InterruptedException {
    int Count = 0;
    for (IntWritable val : values) {
        Count += val.get();
    }
    totalCommits.set(Count);
    String[] keySplit = key.toString().split(",");

    mos.write(new Text(keySplit[1]), new Text(totalCommits.toString()),keySplit[0]);
}

@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
    mos.close();
}

写入方法应按以下顺序设置参数:键,值,文件名
键和值类型应与代码第一行中的类型声明相同,文件名应为字符串。请注意,您不能在文件名中使用特殊字符,例如“-”,“:”等。