1.Hadoop 内置的数据类型的介绍
的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。Hadoop提供了如下内置的数据类型,这些数据类型都实现了WritableCamparable接口,以便用这些类型定义
IntWritable:整型数 (常用)Text:使用UTF8格式存储的文本 (常用)BooleanWritable:标准布尔型数值ByteWritable:单字节数值DoubleWritable:双字节数FloatWritable:浮点数Long Writable:长整型数Nu1lWritable:当<key, value>中的key或value为空时使用
2.为什么要自定义数据类型
在上一节中介绍的复合主键()的实现方法是将几个字符串数据简单拼接而成,处理这种用字符串拼接形成
的复合主键的可能不是很高,可以采用自定义一个专门的数据类型来表示这个复合主键的方法。(简记:效率不高
,无法满足多元化要求,所以自定义数据类型)
3.如何自定义数据类型
自定义数据类型时,必须实现Writable接口或者WritableComparable接口;才能使自定义的数据类型能被序
列化后完成网络传输或文件输人输出。(ps:如果该自定义的数据类型需要作为主键key使用或者需要比较数值大
小时,则只能选择实现WritableComparable接口,因为WritableComparable接口中有compareTo()方法。)
所以为了简单起见,我的建议是自定义数据类型一律直接实现WritableComparable接口,避免麻烦。
在hadoop0.2的API中 WritableComparable接口的定义如下:
自定义数据类型实现 WritableComparable接口,实现上面三个方法即可。
举个例子:
public class Point3D inplements WritableComparable {
public float x, y, z;
public Point3D(float fx, float fy, float fz) {
this.x = fx;
this.y = fy;
this.z = fz;
}
public void readFields(DataInput in) throws IOException {
x = in.readFloat();
y = in.readFloat();
z = in.readFloat();
}
public void write(DataOutput out) throws IOException {
out.writeFloat(x);
out.writeFloat(y);
out.writeFloat(z);
}
public String toString() {
return Float.toString(x) + ", "
+ Float.toString(y) + ", "
+ Float.toString(z);
}
public int compareTo(Point3D other) {
return Float.compareTo(
distanceFromOrigin(),
other.distanceFromOrigin());
}
public boolean equals(Object o) {
if( !(o instanceof Point3D)) {
return false;
}
Point3D other = (Point3D) o;
return this.x == o.x
&& this.y == o.y
&& this.z == o.z;
}
/* 实现 hashCode() 方法很重要
* Hadoop的Partitioners会用到这个方法,后面再说
*/
public int hashCode() {
return Float.floatToIntBits(x)
^ Float.floatToIntBits(y)
^ Float.floatToIntBits(z);
}
}
完成这些后,就可以愉快的像使用hadoop的内置数据类型一样使用这些自定义的数据类型了。