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;

    }



}

猜你喜欢

转载自blog.csdn.net/yang134679/article/details/93781347