MapReduce自定义数据类型

本文详细介绍了Hadoop中Writable接口的重要性及其在自定义数据类型中的应用。通过具体示例,深入解析了如何实现Writable接口进行数据序列化与反序列化,以及如何实现WritableComparable接口进行数据比较,为大数据处理中的数据类型自定义提供了实践指南。
摘要由CSDN通过智能技术生成
数据类型(都实现了Writable接口)
BooleanWritable		//布尔类型
ByteWritable		//单字节数值
DoubleWritable		//双字节数值
FloatWritable		//浮点数
IntWritable			//整型数
LongWritable		//长整型
Text				//UTF-8格式存储的文本
NullWritable		//空类型

因为shuffle中排序依据是key,若定义的数据类型为Key,必须实现writable和comparable接口,即WritableComparable接口

Writable

write() 把每个对象序列化到输出流
readFilds() 把输入流字节反序列化到输入流

自定义数据类型实例

1.定义私有变量
2.setter,getter方法
3.无参有参构造器
4.set()方法,帮助构造器初始化数据(Hadoop偏爱)
5.hashCode()方法和equals()方法
6.toString()方法
7.implement Writable并实现write()方法readFilds()方法
8.implement WritableComparable并实现compareTo()方法

package com.cenzhongman.io;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;

public class UserWritable implements WritableComparable<UserWritable> {
	private int ip;
	private String name;

	public UserWritable() {
	}

	public UserWritable(int ip, String name) {
		this.set(ip, name);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ip;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public String toString() {
		return ip + "\t" + name;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		UserWritable other = (UserWritable) obj;
		if (ip != other.ip)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public void set(int ip, String name) {
		this.setIp(ip);
		this.setName(name);
	}

	public int getIp() {
		return ip;
	}

	public void setIp(int ip) {
		this.ip = ip;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// read和write方法元素的顺序必须一致
	@Override
	public void readFields(DataInput arg0) throws IOException {
		this.ip = arg0.readInt();
		this.name = arg0.readUTF();
	}

	@Override
	public void write(DataOutput arg0) throws IOException {
		arg0.writeInt(ip);
		arg0.writeUTF(name);
	}

	@Override
	public int compareTo(UserWritable o) {
		int comp = Integer.valueOf(this.getIp()).compareTo(o.getIp());

		if (comp != 0) {
			return comp;
		}
		return this.getName().compareTo(o.getName());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值