2

我正在尝试了解如何在 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[]数组读取?

4

2 回答 2

3

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

看一个例子,展示如何IntArrayWritable在映射器中填充一个。

于 2013-03-12T21:20:21.967 回答
0

尽管 harpun 的解决方案正常工作,但我想到了另一个问题.. 这个问题更多的是关于性能,因为我的应用程序进行了大量的int[]写入和读取..

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

写:

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

读:

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

而不是每次都将其包装成 IntArrayWritable ..

写:

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);

读:

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();

不是吗?你怎么看?

于 2013-03-13T11:36:04.440 回答