Java Hadoop从HDFS中写入/读取int[]
我试图理解如何在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
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();