一:Hadoop内置的数据类型。
Hadoop提供如下内置的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。
BooleanWritable | 标准布尔型数值 |
ByteWritable | 单字节数值 |
DoubleWritable | 双字节数 |
FloatWritable | 浮点数 |
IntWritable | 整型数 |
LongWritable | 长整型数 |
Text | 使用UTF-8格式存储的文本 |
NullWritable | 当<key,value>中的key或value为空时使用 |
//简单知道这些类型
IntWritable iw = new IntWritable(1);
System.out.println( iw.get() ); // 1
BooleanWritable bw = new BooleanWritable(true);
System.out.println( bw.get() ); // true
二:Hadoop-用户自定义的数据类型。
自定义数据类型时,需满足两个基本要求,即
1.实现Writable接口,以便该数据能被序列化后完成网络传输或文件输入/输出。
2.如果该数据需要作为主键key使用,或需要比较数值大小时,则需要实现WritableComparable接口。
//Hadoop2.6.4版 - Writable源码:
public interface Writable {
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOException;
}
public interface WritableComparable<T> extends Writable, Comparable<T> {}
三:Hadoop内置的数据输入格式和RecordReader。
数据输入格式(InputFormat)用于描述MapReduce作业的数据输入规范。MapReduce框架依靠数据输入格式完成输入规范检查、对数据文件进行输入分块(InputSplit),以及提供从输入分块中将数据记录逐一读出、并转换为Map过程的输入键值对等功能。
Hadoop提供了丰富的内置数据输入格式,最常用的数据输入格式包括:TextInputFormat 和 KeyValueInputFormat。
TextInputFormat是系统默认的数据输入格式,可以将文本文件分块并逐行读入以便Map节点进行处理。读入一行时,所产生的主键key就是当前行在整个文本文件中的字节偏移位置,而value就是该行的内容。
//TextInputFormat部分源码:
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
String delimiter = context.getConfiguration().get(
"textinputformat.record.delimiter");
byte[] recordDelimiterBytes = null;
if (null != delimiter)
recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
return new LineRecordReader(recordDelimiterBytes);
}
//....
}
KeyValueTextInputFormat是另一个常用的数据输入格式,可将一个按照<key,value>格式逐行存放的文本文件逐行读出,并自动解析生成相应的key和value。
//KeyValueTextInputFormat部分源码:
public class KeyValueTextInputFormat extends FileInputFormat<Text, Text> {
// ...
public RecordReader<Text, Text> createRecordReader(InputSplit genericSplit,
TaskAttemptContext context) throws IOException {
context.setStatus(genericSplit.toString());
return new KeyValueLineRecordReader(context.getConfiguration());
}
}
RecordReader:对于一个数据输入格式,都需要有一个对应的RecordReader,主要用于将一个文件中的数据记录拆分成具体的键值对。TextInputFormat的默认RecordReader是LineRecordReader,而KeyValueTextInputFormat的默认RecordReader是KeyValueLineRecordReader。
四:Hadoop内置的数据输出格式与RecordWriter。
数据输出格式(OutputFormat)用于描述MapReduce作业的数据输出规范。MapReduce框架依靠数据输出格式完成输出规范检查以及提供作业结果数据输出功能。
同样,最常用的数据输出格式是TextOutputFormat,也是系统默认的数据输出格式,可以将计算结果以 “key + \t + vaue”的形式逐行输出到文本文件中。
与数据输入格式类似样,数据输出格式也提供一个对应的RecordWriter,以便系统明确输出结果写入到文件中的具体格式。TextInputFormat的默认RecordWriter是LineRecordWriter,其实际操作是将结果数据以“key + \t + value”的形式输出到文本文件中。
//TextOutputFormat的部分源码:
public class TextOutputFormat<K, V> extends File