8.3hadoop mapreduce 输出格式
1.1 输出格式
1.1.1 TextOutputFormat文本输出
默认输出格式,键值通toString()转为文本,Tab键分隔,属性mapreduce.putput. textoutputformat.separator属性设置分隔符。
1.1.2 二进制输出
(1) SequenceFileOutputFormat
输出写为顺序文件,格式紧凑,容易压缩。
(2) SequenceFileAsBinaryOutputFormat
用原始的二进制格式把键值对写入顺序文件。
(3)MapFileOutputFormat
把map文件作为输出,MapFile中键必须按顺序添加。reduce输入键一定是有序的,但是输出不一定,有reduce函数控制,所以MapFileOutputFormat需要额外限制输出有序。
1.1.3 多个文件输出
输出文件名自定义或者输出多个文件。例如将温度数据按照气象局输出文件,每个气象局一个文件。方法时一个气象局对应一个reduce,重写partitioner,同一个气象局的数据放到一个partition分区,reduce个数设置为气象局的个数。可能reduce数量过多,reduce作业数据量分配不均。应该用比较少的reduce做更多的事情,减少额外的开销。所以让集群自行决定分区数,优化性能。这样一个reduce就要按照多个气象局写入多个文件,因此使用MultipleOutput,创建多个name-m-nnnnn或者reduce输出文件name-r-nnnnn,nnnnn为块号。
实例:用MultipleOutput类将整个数据集分区到气象局id命名的文件中
public class PartitionByStationIdMultipleOutputs extends Configured implements Tool
{ //重写map函数
static class StationMapper extends Mapper<LongWritable,Text,Text,Text>
{
privare NcdcRecordParser parser=new NcdcRecordParser();
@override
protected void map(LongWriteable key,Text value,Context context)throws IOexception,InterruptedException
{
parser.parse(value);
context.write(new Text(parser.getStationId()),value);
}
}
reduce类
static class MultipleOutputsReducer extends Reduce<Text,Text,NullWritable,Text>
{
private MultipleOutputs<NullWritable,Text> multipleOutputs;
@Override
protected void setup(Context context) throws IOException,InterruptedException
{
multipleoutputs=new MuletipleOuputs<NullWritable,Text>(context);
}
@override
public void reduce(Text key,Iterable<Text> values, Context context) throws IOException,InterruptedException{
for(Text value:values)
{
//键,值,key气象局id作为文件名称
multipleOutputs.write(NullWritable.get(),value,key.toString());
}
}
@Override
protect void cleanup(Context context)throws IOException,InterruptedException{
multipleOutputs.close();
}
@overide
protected int run(String[] args) throws Exception{
Job job=JobBuilder.parIntputAndOutput(this,getConf(),args);
if(job==null)
{
return -1;
}
job.setMapperClass(StationMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setReduceClass(MultipeOutputsReducer.class);
job.setOutputKeyClass(NullWritable.class);
return job.waitForCompletion(true)?0:1;
}
public static void main(String[] args) throw Exception
{
int exitCode=ToolRunner.run(new PartitionByStationIdMultipleOutput, args);
System.exit(exitCode);
}
}
}
mapper中用parse解析出了StationId,输出键为StationId,输出值为气象数据。reduce中不用context输出,而是用MutipleOutput,输出键为NullWritable,输出值为气象数据,输出文件名为气象局的Id。
1.1.4 延迟输出
FileOutputFormat子类在数据为空时,也会创建空文件,所以可以使用LazyOutputFormat,有一条记录时才会创建文件。streaming 使用 –LazyOutput参数选项来开启LazyOutputFormat。
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix