Java Hadoop从HDFS中写入/读取int[]

Java Hadoop从HDFS中写入/读取int[],java,hadoop,hdfs,Java,Hadoop,Hdfs,我试图理解如何在HDFS中的文件中写入和读取int数组。。 由于int[]数组不是writeable对象,因此我实际上使用的是类org.apache.hadoop.io.objectwriteable 因此,写入任务归结为以下调用: new ObjectWritable(int[].class, array).write(arg0); 相反,读取任务会导致以下情况: int[] array = {}; new ObjectWritable(int[].class, array).readFie

我试图理解如何在HDFS中的文件中写入和读取int数组。。 由于
int[]
数组不是
writeable
对象,因此我实际上使用的是类
org.apache.hadoop.io.objectwriteable

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

new ObjectWritable(int[].class, array).write(arg0);
相反,读取任务会导致以下情况:

int[] array = {};
new ObjectWritable(int[].class, array).readFields(arg0);
我不太确定最后一段代码。事实上,如果我尝试执行它,我会在第二行得到一个
NullPointerException


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

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


请看一个演示如何在mapper中填充
InArrayWritable

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

我认为下面的解决方案应该更有效

写:

WritableUtils.writeVInt(out, array.length);
for(int i=0; i<array.length; i++)
   WritableUtils.writeVInt(out, array[i]);
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);
writeableutils.writeVInt(out,array.length);
对于(int i=0;i
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();