我希望输出文件的格式为2012117-part-r-00000。基本上我希望输出文件有附加到它的日期,这样我就可以根据日期安排文件。我看了OutputFormat和FileOutputFormat,但它对我的情况没有帮助。
nuypyhwy1#
我刚刚发现对于新的API,我可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs和方法addNamedOutput()
z5btuh9x2#
MR作业的输出文件名没有太大的灵活性,使用MultipleOutputFormat的子类。必须实现MultipleOutputFormat#generateFileNameForKeyValue方法,忽略此方法的输入并返回date + -part-r- + mapred.task.partition模式的字符串。mapred.task.partition是int,因此必须适当地用0预先填充。
date + -part-r- + mapred.task.partition
fdbelqdn3#
有两种方法可以更改输出文件名。
// job.setOutputFormatClass(TextOutputFormat.class); LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class); MultipleOutputs.addNamedOutput(job,“20180318”, TextOutputFormat.class, Text.class, IntWritable.class);
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
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等。
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方法应具有以下序列的参数:密钥、值、文件名。
键和值类型应与代码第一行中的类型声明相同,文件名应为字符串。请注意,不能在文件名中给予特殊字符,如“-"、“:“等。
5条答案
按热度按时间nuypyhwy1#
我刚刚发现对于新的API,我可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs和方法addNamedOutput()
z5btuh9x2#
MR作业的输出文件名没有太大的灵活性,使用MultipleOutputFormat的子类。
必须实现MultipleOutputFormat#generateFileNameForKeyValue方法,忽略此方法的输入并返回
date + -part-r- + mapred.task.partition
模式的字符串。mapred.task.partition是int,因此必须适当地用0预先填充。fdbelqdn3#
有两种方法可以更改输出文件名。
参考链接:http://data-flair.training/forums/topic/in-mapreduce-how-to-change-the-name-of-output-file-from-part-r-00000
vsaztqbk4#
可以通过Mapper/Reducer类中的Multiple Output Format实现,例如:
在Map器/还原器类中创建MultipleOutputs的对象。
在设置中,您可以执行以下操作:
然后,在map/reduce方法中,你可以:
这将为您提供文件名,如xyz-m-00000等。
zujrkrfu5#
如果要将日期附加到输出文件,请使用MultipleOutputs Apache Hadoop
下面是一个示例代码,让您熟悉:
write方法应具有以下序列的参数:密钥、值、文件名。
键和值类型应与代码第一行中的类型声明相同,文件名应为字符串。请注意,不能在文件名中给予特殊字符,如“-"、“:“等。