相关知识
为了完成本关任务,你需要掌握:1.如何获取数组的长度,2.如何遍历数组。
OutputFormat及其子类
OutputFormat类
本类主要用于描述输出数据的格式,它能够将用户提供的 key/value 对写入特定格式的文件中。主要涉及以下两个方法:
RecordWriter<K, V> getRecordWriter(TaskAttemptContext var1):根据TaskAttemptContext(map及reduce函数的参数Context对象间接继承自该类)对象中的相关信息返回一个RecordWriter()对象(包含一个键值对数据)。后者负责键值对的写入操作。
void checkOutputSpecs(JobContext var1):用于检测作业输出规范有效性。比如FileOutputFormat中输出路径未设置、输出路径已存在时会抛出异常。该方法通常会在任务初始化阶段被调用。
OutputCommitter getOutputCommitter(TaskAttemptContext var1):方法来负责确保输出被正确提交。
FileOutputFormat类
所有写入到文件系统的类都继承自该类,实现了一些公共方法。输入基类该类继承自OutputFormat类,实现了以上最后两个方法。下面对一些常用方法进行总结。
setOutputPath(Job job, Path outputDir):设置输出路径。
setCompressOutput(Job job, boolean compress):是否使用压缩算法压缩输出。
setOutputCompressorClass(Job job, Class<? extends CompressionCodec> codecClass):设置压缩算法所使用的类。
checkOutputSpecs(JobContext job):实现了OutputFormat,该方法会在输出路径未设置、输出路径存在时抛出异常。
getOutputCommitter(TaskAttemptContext var1):待看其并未实现
getRecordWriter()方法,由其子类实现。
TextOutputFormat类
该类继承自FileOutputFormat类,主要用途是将每条记录写为文本行。实现了getRecordWriter方法。该方法会返回一个TextOutputFormat所定义的内部类LineRecordWriter来实现输出。
相关源码解析参见:http://blog.51cto.com/luchunli/1719174
TextOutputFormat类的每个键-值对由制表符进行分隔, 可通过mapreduce.output.textoutputformat.separator属性改变默认的分隔符。可以使用NullWritable来省略输出的键或值。
NullOutputFormat类
该类相当于没有任何输出。根据其源码可以看出,其所有的方法均为空方法体。
SequenceFileOutFotmat类
该类负责将输出写为一个顺序文件,特别适合迭代式的MapReduce作业。
SequenceFileAsBinaryOutFotmat类
使用原始二进制格式将键值对写到一个顺序文件中。
MapFileOutputFormat类
使用mapfile作为输出格式。对于MapFile,其键必须有序。
RecordWriter类
该类源码如下,主要包含两个方法,见注释
public abstract class RecordWriter<K, V> {
public RecordWriter() {
}
# 将键值对数据写入输出路径
public abstract void write(K var1, V var2) throws I