—— InputFormat、OutputFormat、MultipleOutputs、GroupingComparator
MapReduce开始阶段,InputFormat类用来产生InputSplit,并基于RecordReader把它切分成record,形成Mapper的输入。
——MR内置的InputFormat
作为默认的文件输入格式,用于读取纯文本文件,文件被分为一系列以LF或者CR结束的行,key是每一行的位置偏移量,是LongWritable类型的,value是每一行的内容,为Text类型。
同样用于读取文本文件,如果行被分隔符(缺省是tab)分割为两部分,第一部分为key,剩下的部分为value;如果没有分隔符,整行作为 key,value为空。
用于读取sequence file
sequence file是Hadoop用于存储数据自定义格式的binary文件。它有两个子类:SequenceFileAsBinaryInputFormat,将 key和value以BytesWritable的类型读出;SequenceFileAsTextInputFormat,将key和value以Text类型读出。
根据filter从sequence文件中取得部分满足条件的数据,通过 setFilterClass指定Filter,内置了三种 Filter:
0.18.x新加入,可以将文件以行为单位进行split,比如文件的每一行对应一个mapper。得到的key是每一行的位置偏移量(LongWritable类型),value是每一行的内容,Text类型。
用于多个数据源的join
——为MR设置指定的InputFormat
job.setInputFormatClass(XXXInputFormat.class);
——也可以自定义InputFormat
自己写一个类直接或间接的继承InputFormat抽象类即可
MapReduce结束阶段,OutputFormat类决定了Reducer如何产生输出。
——MR内置的OutputFormat
以行分隔、包含制表符定界的键值对的文本文件格式
二进制键值数据的压缩格式
原生二进制数据的压缩格式
一种使用部分索引键的格式
——为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上,决定如何产生输出。
Mapreduce(6)----OutputforMat格式设置
原文:https://www.cnblogs.com/Lee-yl/p/13345469.html