请教各位大佬,关于自定义Writable

最近看到一篇文章,有关自定义Writable的,文章如下:

=========================================

start:

importjava.io.*;

importorg.apache.hadoop.io.*;

publicclassTextPairimplementsWritableComparable {

privateText first;

privateText second;

publicTextPair() {

set(newText(),newText());

}

publicTextPair(String first, String second) {

set(newText(first),newText(second));

}

publicTextPair(Text first, Text second) {

set(first, second);

}

publicvoidset(Text first, Text second) {

this.first first;

this.second second;

}

publicText getFirst() {

returnfirst;

}

publicText getSecond() {

returnsecond;

}

@Override

publicvoidwrite(DataOutput out)throwsIOException {

first.write(out);

second.write(out);

}

@Override

publicvoidreadFields(DataInput in)throwsIOException {

first.readFields(in);

second.readFields(in);

}

@Override

publicinthashCode() {

returnfirst.hashCode() *163second.hashCode();

}

@Override

publicbooleanequals(Object o) {

if(oinstanceofTextPair) {

TextPair tp (TextPair) o;

returnfirst.equals(tp.first) && second.equals(tp.second);

}

returnfalse;

}

@Override

publicString toString() {

returnfirst +"\t"+ second;

}

@Override

publicintcompareTo(TextPair tp) {

intcmp first.compareTo(tp.first);

if(cmp !=0{

returncmp;

}

returnsecond.compareTo(tp.second);

}

}

 

此实现的第一部分直观易懂:有两个Text实例变量(firstsecond)和相关的构造函数、get方法和set方法。所有的Writable实现都必须有一个默认的构造函数,以便MapReduce框架能够对它们进行实例化,进而调用readFields()方法来填充它们的字段。Writable实例是易变的、经常重用的,所以我们应该尽量避免在write()readFields()方法中分配对象。通过委托给每个Text对象本身,TextPairwrite()方法依次序列化输出流中的每一个Text对象。同样,也通过委托给Text对象本身,readFields()反序列化输人流中的字节。DataOutputDataInput接口有丰富的整套方法用于序列化和反序列化Java基本类型,所以在一般情况下,我们能够完全控制Writable对象的数据传输格式。

====================================================

我不是很明白,实例的易变性和重用性与在write()或readFields()方法中分配对象的关系,有人可以讲解一下吗?不胜感激!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值