背景知识:
Hadoop类、接口的标识:
Hadoop的类、接口文件都要引入两个类InterfaceAudience;InterfaceStability;InterfaceAudience用于标 记该类文件可以被访问的权限。熟悉的有public、private。LimitedPrivate 只能在归属的架构中例如HDFS、HBase中被引用。InterfaceStability用于标记该类文件相对于Hadoop版本升级的稳定性。Stable:只有在主版本升级时可能不兼容。Evolving: 在子版本升级时可能不兼容。Unstable:最不稳定的,兼容性在任何版本下都无法提前预知、保证。
序列化:将对象转换为字节流的方法。可以用于(1)进程间的通信(2)数据持久性存储。
interface Writable
Writable是对Java IO中的DataOutput、DataInput的封装,因此实现实现Writable接口对数据进行序列化。
Hadoop中的数据类型、包括自定以的数据类型均要作为key、value传输、写入HDFS,因此都要实现Writable。这也是Hadoop不采用Java原始数据类型的原因。
Writable定义了
void write(DataOutput out) throws IOException;
void readFields(DataInput in) throws IOExceptio;
二者用来读、写字段。
interface WritableComparable<T>
继承了Writable, Comparable<T>。
Map-Reduce框架中作为key的数据类型需要实现该接口。可以自定义某一数据类型同类之间比较方法以及生成该类型数据hashCode方法。
参考陆驾恒的《Hadoop实战》中表格:
JAVA基本类型 | Writable中的类型 | 序列化后字节数 |
boolean | BooleanWritalbe | 1 |
byte | ByteWritable | 1 |
int | IntWritable | 4 |
VIntWritable | 1-5 | |
float | FloatWritable | 4 |
long | LongWritable | 8 |
VLongWritalbe | 1-9 | |
double | DoubleWritable | 8 |
以下是官方编写compareTo方法,可以比较int大小this.int < int 返回-1;
public int compareTo(MyWritableComparable o) {
int thisValue = this.value;
int thatValue = o.value;
return (thisValue < thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
}
此外,BinaryComparable类实现了二进制数组的比较。
通过以上的介绍,我们可以通过实现Writable、WritalbeComparable接口来实现自己的数据类型。