hadoop序列化自定义类型以及序列化对象比较解析
?其中write方法依次将两个text序列化,readFields方法对来自输入流的字节进行反序列化。
hashCode,equals,toString方法需要重写,其中hashCode方法通常被用作进行reduce分区,所以应该确保其有比较好的算法来实现平均分配。
?
下面来说一下比较,比较对于mapreduce来说是比较关键的,因为中间有急于键的排序操作。通常来说可以通过类中的compareTo方法对其进行反序列化,然后再进行比较,但是这样来说中间又多了一步,那有没有可以直接通过序列化对象来进行比较的方式呢,答案当然是有了,那就是继承自RawComparator
public int comparable() throws IOException{ RawComparator comp = WritableComparator.get(TextPair.class); byte[] out1 = serialize(tp1); byte[] out2 = serialize(tp2); return comp.compare(out1, 0, out1.length, out2, 0, out2.length); } public static byte[] serialize(Writable writable) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); DataOutputStream dataOut = new DataOutputStream(out); writable.write(dataOut); dataOut.close(); return out.toByteArray(); }??
可以看到几乎所有的继承自WritableComparable的类都在其内部定义了静态的raw比较类,为快速比较提供了基础。
?
?
?
?
?
?
?