hadoop的outputformat

一、概述

  1. MapReduce结束阶段,OutputFormat类决定了Reducer如何产生输出
  2. Hadoop本身提供了若干内置的OutputFormat
  3. 如果不明确指定默认使用TextOutputFormat

 

二、常见子类

  1. TextOutputFormat - 以行分隔、包含制表符定界的键值对的文本文件格式
  2. SequenceFileOutputFormat - 二进制键值数据的压缩格式
    1. SequenceFileAsBinaryOutputFormat - 原生二进制数据的压缩格式
  3. MapFileOutputFormat - 一种使用部分索引键的格式
  4. MultipleOutputFormat - 使用键值对参数写入文件的抽象类
    1. MultipleTextOutputFormat - 输出多个以标准行分割、制表符定界格式的文件
    2. MultipleSequenceFileOutputFormat - 输出多个压缩格式的文件
  5. DBOutputFormat - 将数据以指定形式写到数据库中

 

三、自定义输出格式

概述

  1. 所有的OutputFormat都要直接或间接的继承OutputFormat抽象类
  2. OutputFormat抽象类中定义了如下的抽象方法:getRecordWriter(TaskAttemptContext context) ,  checkOutputSpecs(JobContext context )以及getOutputCommitter(TaskAttemptContext context)
  3. 如果输出的目的地是文件,则可以继承FileOutputFormat,这个类中实现了checkOutputSpecs和getOutputCommitter方法,并将getRecordWriter()设置为抽象方法要求子类实现
  4. 如果想要更精细的改变逻辑可以自己去编写getOutputCommitter和checkOutputSpecs方法

 

四、多源输出

public class MoutMapper extends Mapper<LongWritable, Text, Text, Text> {

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

       String line = value.toString();

        String[] arr = line.split(" ");

        context.write(new Text(arr[0]), new Text(arr[1]));

    }

}
public class MoutReducer extends Reducer<Text, Text, Text, Text> {

    private MultipleOutputs<Text, Text> mo;

    @Override

    protected void setup(Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {

        mo = new MultipleOutputs<>(context);

    }



    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {



        String name = key.toString();

        Text value = values.iterator().next();

        if (name.charAt(0) <= 'I')

            mo.write("a2i", key, value);

        else

            mo.write("j2z", key, value);



    }



}
public class MoutDriver {



    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();

        Job job = Job.getInstance(conf, "JobName");

        job.setJarByClass(cn.tedu.multiout.MoutDriver.class);

        job.setMapperClass(MoutMapper.class);

        job.setReducerClass(MoutReducer.class);

        

        job.setMapOutputKeyClass(Text.class);

        job.setMapOutputValueClass(Text.class);



        FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.32.147:9000/txt/score2.txt"));

        FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.32.147:9000/result4"));

        

        MultipleOutputs.addNamedOutput(job, "a2i", TextOutputFormat.class, Text.class, Text.class);

        MultipleOutputs.addNamedOutput(job, "j2z", TextOutputFormat.class, Text.class, Text.class);

        

        if (!job.waitForCompletion(true))

            return;

    }



}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼鱼大头鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值