Hadoop:将BytesWritable转换为byte []

时间:2017-11-29 12:10:05

标签: java hadoop mapreduce

有人可以帮我将BytesWritable转换为byte []。如果我使用value.getBytes(),那么我得到额外的字节,其中value是BytesWritable。

谢谢

1 个答案:

答案 0 :(得分:1)

你遇到的问题是BytesWritable包含一个字节数组和一个长度。你必须结合使用这些。这是我编写的一个小单元测试,向您展示发生了什么:

@Test
public void testBytesWritable() {

    BytesWritable bw = new BytesWritable();
    Text t1 = new Text("ABCD");
    bw.set(t1.getBytes(), 0, t1.getLength());
    System.out.println("Size: " + bw.getBytes().length);

    Text t2 = new Text("A");
    bw.set(t2.getBytes(), 0, t2.getLength());
    System.out.println("Size: " + bw.getBytes().length);

    byte[] newArray = Arrays.copyOf(bw.getBytes(), bw.getLength());
    System.out.println("Size: " + newArray.length);
}

打印出来:

Size: 6
Size: 6
Size: 1

因此,您可以看到BytesWritable设置了两次,第一次使用更长的字节集。打印出字节数组的长度表明内部字节数组的长度不会减少,它会保持很大。因此,您必须使用getLength()方法来确定BytesWritable中有多少字节有效。在单元测试中,我使用Arrays.copyOf()来获取正确的字节,因为它需要一个字节数组和一个长度。