最近看到一篇文章,有关自定义Writable的,文章如下:
=========================================
start:
importjava.io.*;
importorg.apache.hadoop.io.*;
publicclassTextPairimplementsWritableComparable
privateText
privateText
publicTextPair()
set(newText(),newText());
}
publicTextPair(String
set(newText(first),newText(second));
}
publicTextPair(Text
set(first,
}
publicvoidset(Text
this.first
this.second
}
publicText
returnfirst;
}
publicText
returnsecond;
}
@Override
publicvoidwrite(DataOutput
first.write(out);
second.write(out);
}
@Override
publicvoidreadFields(DataInput
first.readFields(in);
second.readFields(in);
}
@Override
publicinthashCode()
returnfirst.hashCode()
}
@Override
publicbooleanequals(Object
if(oinstanceofTextPair)
TextPair
returnfirst.equals(tp.first)
}
returnfalse;
}
@Override
publicString
returnfirst
}
@Override
publicintcompareTo(TextPair
intcmp
if(cmp
returncmp;
}
returnsecond.compareTo(tp.second);
}
}
此实现的第一部分直观易懂:有两个Text实例变量(first和second)和相关的构造函数、get方法和set方法。所有的Writable实现都必须有一个默认的构造函数,以便MapReduce框架能够对它们进行实例化,进而调用readFields()方法来填充它们的字段。Writable实例是易变的、经常重用的,所以我们应该尽量避免在write()或readFields()方法中分配对象。通过委托给每个Text对象本身,TextPair的write()方法依次序列化输出流中的每一个Text对象。同样,也通过委托给Text对象本身,readFields()反序列化输人流中的字节。DataOutput和DataInput接口有丰富的整套方法用于序列化和反序列化Java基本类型,所以在一般情况下,我们能够完全控制Writable对象的数据传输格式。
====================================================我不是很明白,实例的易变性和重用性与在write()或readFields()方法中分配对象的关系,有人可以讲解一下吗?不胜感激!!