Mapreduce(6)----OutputforMat格式设置

MapReduce中的输入输出控制(转)

—— InputFormat、OutputFormat、MultipleOutputs、GroupingComparator

1.InputFormat概述

MapReduce开始阶段,InputFormat类用来产生InputSplit,并基于RecordReader把它切分成record,形成Mapper的输入。

——MR内置的InputFormat

1)TextInputFormat

作为默认的文件输入格式,用于读取纯文本文件,文件被分为一系列以LF或者CR结束的行,key是每一行的位置偏移量,是LongWritable类型的,value是每一行的内容,为Text类型。

2)KeyValueTextInputFormat

同样用于读取文本文件,如果行被分隔符(缺省是tab)分割为两部分,第一部分为key,剩下的部分为value;如果没有分隔符,整行作为 key,value为空。

3)SequenceFileInputFormat

用于读取sequence file

sequence file是Hadoop用于存储数据自定义格式的binary文件。它有两个子类:SequenceFileAsBinaryInputFormat,将 key和value以BytesWritable的类型读出;SequenceFileAsTextInputFormat,将key和value以Text类型读出。

4)SequenceFileInputFilter

根据filter从sequence文件中取得部分满足条件的数据,通过 setFilterClass指定Filter,内置了三种 Filter:

  • RegexFilter取key值满足指定的正则表达式的记录;
  • PercentFilter通过指定参数f,取记录行数%f==0的记录;
  • MD5Filter通过指定参数f,取MD5(key)%f==0的记录。

5)NLineInputFormat

0.18.x新加入,可以将文件以行为单位进行split,比如文件的每一行对应一个mapper。得到的key是每一行的位置偏移量(LongWritable类型),value是每一行的内容,Text类型。

6)CompositeInputFormat

用于多个数据源的join

 

——为MR设置指定的InputFormat

job.setInputFormatClass(XXXInputFormat.class);

 

——也可以自定义InputFormat

自己写一个类直接或间接的继承InputFormat抽象类即可

 

2.MR中的输出控制-OutputFormat

MapReduce结束阶段,OutputFormat类决定了Reducer如何产生输出。

https://blog.csdn.net/zhanglh046/article/details/78557453

  • 2.1DBOutputFormat: 发送Reduce结果到SQL表中
  • 2.2FileOutputFormat: 将Reduce结果写入文件中

2.2.1MapFileOutputFormat: 主要是处理MapFile(特殊的SequenceFile)的输出

2.2.2SequenceFileOutputFormat: 主要是处理SequenceFile的输出

2.2.3TextFileOutputFormat: 主要是处理普通文本的输出,也是默认实现

  • 2.3FilterOutputFormat:主要就是方便包装其他OutputFromat(没用过)
  • 2.4NullOutputFormat: 把所有的输出放到/dev/null(没用过)

——MR内置的OutputFormat

1)TextOutputFormat

以行分隔、包含制表符定界的键值对的文本文件格式

2)SequenceFileOutputFormat

二进制键值数据的压缩格式

3)SequenceFileAsBinaryOutputFormat

原生二进制数据的压缩格式

4)MapFileOutputFormat

一种使用部分索引键的格式

——为MR设置指定的OutputFormat

job.setOutputFormatClass(SequenceFileOutputFormat.class);

——同理也可以自定义输出格式化器

所有的OutputFormat都要直接或间接的继承OutputFormat抽象类

// 要控制不同的内容写往不同的目标路径,可以采用自定义outputformat的方法
job.setOutputFormatClass(LogEnhanceOutputFormat.class);

// 尽管我们用的是自定义outputformat,但是它是继承制fileoutputformat
// 在fileoutputformat中,必须输出一个_success文件,所以在此还需要设置输出path

FileOutputFormat.setOutputPath(job, new Path("H:/out/"));

原文链接:https://blog.csdn.net/zhou920786312/java/article/details/87031643

OutputFormat抽象类中定义了如下的抽象方法:

public abstract RecordWriter<K, V> getRecordWriter(TaskAttemptContext context) 
public abstract void checkOutputSpecs(JobContext context )
public abstract OutputCommitter getOutputCommitter(TaskAttemptContext context) 

我们可以直接继承OutputFormat,但更多的时候我们会选择继承他的一个实现子类,比如FileOutputFormat -- 此类是所有目的地为文件的OutputFormat的基类,例如默认的TextOutputFormat就继承自它。

FileOutputFormat实现了OutputFormat接口,默认实现了checkOutputSpecs和getOutputCommitter方法,并将getRecordWriter()设置为抽象方法要求我们去实现。

如果想要更精细的改变逻辑可以自己去编写getOutputCommitter和checkOutputSpecs方法。

而更多的时候,我们直接使用父类中的方法而将精力放置在getRecordWriter上,决定如何产生输出。

原文地址:https://www.cnblogs.com/Lee-yl/p/13345469.html