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

最後のコード スニペットについてはよくわかりません。実際に実行しようとすると、NullPointerException2 行目に a が表示されます。

int[]配列の読み取りを正しく実行するにはどうすればよいですか?

4

2 に答える 2

3

オブジェクトの配列には、組み込みクラスArrayWritableを使用する必要があります。IntArrayWritablejavadoc に記載されているように、それをサブクラス化し、配列要素の適切なクラス型を設定する のような新しい型を作成する必要があります。

マッパーにを設定する方法を示すを見てください。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 に答える