今天使用ByteWritable时候遇到了问题,浪费了好多时间,最后通过查看ByteWritable的源代码才解决这个问题。分享一下,希望能帮助别人节约点时间。
自己写了一个类继承了RecordReader<IntWritable, BytesWritable>,在这里value是使用BytesWritable,并且打印了一下byte[]
输出如下:
-27-128-110-26-114-11032-25-76-94-27-68-10732-26-106-121-26-95-9332Len21
在Mapper里输入自然是<IntWritable, BytesWritable>,但是我用这个方法打印穿过来的BytesWritable类型的contents时候,确不和上面的结果相同:
输出是:
-27-128-110-26-114-11032-25-76-94-27-68-10732-26-106-121-26-95-93320000000000Len31
注意到长度是不一样的,但是前21个内容是相同的。这是由于Hadoop里面BytesWritable的实现机制造成的,BytesWritable的实现中,保存了一个byte[]存放内容,一个int size表示byte数组里面前多少位是有效的,后面的是无效的,但是ByteWritable的getBytes()方法返回的确实byte数组的全部内容(长度很可能大于size),所以在Mapper中进行处理的时候应该只操纵size大小的内容后面的应该无视掉,如: