为了用作Mapreduce计算的value数据类型,数据类型必须实现org.apache.hadoop.io.Writable接口。Writable接口定义了当需要数据传输和数据存储时,Hadoop应如何序列化和反序列化值。
为了用作Mapreduce计算的key数据类型,数据类型必须实现org.apache.hadoop.io.WritableComparable<T>接口。除了Writable接口的功能之外,有一种WritableComparable接口更进一部定义了如何将这种类型的键相互比较,以达到排序的目的。
Hadoop的可写接口与java的可序列化接口对比
与统一的java本机序列的框架相比,Hadoop的基于可写的序列框架为MapReduce程序提供了更高兴,定制程度更高的序列化和数据表示。相对于java的序列化,Hadoop的可写框架并不记录类型名称,每个对象期望序列化数据的所有客户端必须直到在序列化数据中使用的类型。省略类型名称,使序列化过程更快,结果更紧凑,同时,通过非java的客户端可以很容易的实现随机访问序列化数据格式的功能。
Hadoop基于可写的序列化方式,也具有通过复用Writable对象来减少对象创建开销的功能,这时java本身序列化框架不可能做到的。
hadoop提供一些基本数据类型,如Intwritable/Longwritable/Boolean/writable/FloatWritable和ByteWritable,这时他们各自的java基本上数据类型的Writable版本。可以使用这些类型作为key类型和value类型。
下面是几种Hadoop的内置数据类型,既可以用作key类型,也可以用作value类型。
Text:存储UTF8文本
BytesWritable:存储一个字节序列
VIntWritable和VLongWritable:存储变长整型和长整型值
NullWritable:这是一个零长度的Writable类型,可以在不希望使用key或value类型的时候使用。
下列Hadoop内置的集合数据类型只能用作value类型:
ArrayWritable:存储属于Writable类型的值数组。要使用ArrayWritable类型作为reduce输入的value类型,则需要创建ArrayWritable的子类来指定存储在其中的Writable值的类型。
TwoDArrayWritable:存储属于同一Writable类型的值矩阵。要使用TwoDArrayWritable类型作为reduce输入的value类型,则需要通过创建与ArrayWritable类型相似的TwoDArrayWritable类型的子类来指定存储的值的类型。
MapWritable:存储键值对的映射。键和值应该是Writable数据类型。
SortedMapWritable:存储键值对的有序映射。键应该实现writableComparable接口。