Hadoop从/向HDFS写入/读取int []

时间:2013-03-12 19:32:30

标签: java hadoop hdfs

我正在尝试了解如何在HDFS中向/从文件中写入和读取int数组。 由于int[]数组不是Writable对象,我实际上正在使用类org.apache.hadoop.io.ObjectWritable

因此写入任务归结为以下调用:

new ObjectWritable(int[].class, array).write(arg0);

相反,读取任务会导致以下情况:

int[] array = {};
new ObjectWritable(int[].class, array).readFields(arg0);

我对最后一段代码片段不太确定。事实上,如果我尝试执行它,我会在第二行得到NullPointerException

如何正确读取int[]数组?

2 个答案:

答案 0 :(得分:3)

对于对象数组,您应该使用内置类ArrayWritable。正如javadoc所述,你必须对它进行子类化并创建一个像IntArrayWritable这样的新类型,它设置了数组元素的正确类类型。

查看显示如何在映射器中填充IntArrayWritable的{​​{3}}。

答案 1 :(得分:0)

即使harpun的解决方案正常工作,我也想到了另一个问题。 这个问题更多的是关于表演,看作我的应用程序做了很多int[]写和读..

我认为以下解决方案应该更加高效。

WRITE:

WritableUtils.writeVInt(out, array.length);
for(int i=0; i<array.length; i++)
   WritableUtils.writeVInt(out, array[i]);

READ:

int[] array = new array[WritableUtils.readVInt(in)];
for(int i=0; i<array.length; i++)
   array[i] = WritableUtils.readVInt(in);

而不是每次都将它包装到IntArrayWritable中。

WRITE:

IntWritable[] a = new IntWritable[array.length];
for(int i=0; i<a.length; i++)
   a[i] = new IntWritable(array[i]);
IntArrayWritable arrayWritable = new IntArrayWritable();
arrayWritable.set(a);
arrayWritable.write(arg0);

READ:

IntArrayWritable arrayWritable = new IntArrayWritable();
arrayWritable.readFields(arg0);
Writable[] a = arrayWritable.get();
int[] array = new int[a.length];
for(int i=0; i<array.length; i++)
   array[i] = ((IntWritable)a[i]).get();

不是吗?你怎么看待这个?