hadoop 自定义数据类型

本文介绍了Hadoop内置数据类型及其实现原理,并详细讲解了自定义数据类型的原因和方法,包括实现WritableComparable接口以满足Hadoop序列化需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的内置数据类型一样使用这些自定义的数据类型了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值