如何为Hadoop输出文件给予自定义名称

63lcw9qa  于 2023-01-08  发布在  Hadoop
关注(0)|答案(5)|浏览(143)

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

nuypyhwy

nuypyhwy1#

我刚刚发现对于新的API,我可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs和方法addNamedOutput()

z5btuh9x

z5btuh9x2#

MR作业的输出文件名没有太大的灵活性,使用MultipleOutputFormat的子类。
必须实现MultipleOutputFormat#generateFileNameForKeyValue方法,忽略此方法的输入并返回date + -part-r- + mapred.task.partition模式的字符串。mapred.task.partition是int,因此必须适当地用0预先填充。

fdbelqdn

fdbelqdn3#

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

    • 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

vsaztqbk

vsaztqbk4#

可以通过Mapper/Reducer类中的Multiple Output Format实现,例如:

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

在Map器/还原器类中创建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等。

zujrkrfu

zujrkrfu5#

如果要将日期附加到输出文件,请使用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();
}

write方法应具有以下序列的参数:密钥、值、文件名

键和值类型应与代码第一行中的类型声明相同,文件名应为字符串。请注意,不能在文件名中给予特殊字符,如“-"、“:“等。

相关问题