3

HBaseを使用した文字列配列の保存に関するこの回答(複雑なオブジェクトをhadoop Hbaseに保存する方法)を読みました。

ArrayWritableクラスを使用して配列をシリアル化すると言われています。で、HBase に保存できる をWritableUtils.toByteArray(Writable ... writable)取得します。byte[]

行を再度取得しようとすると、byte[]何らかの形で に再び変換する必要がある が得られArrayWritableます。しかし、これを行う方法が見つかりません。多分あなたは答えを知っていますか、それとも私のシリアライズを根本的に間違っていString[]ますか?

4

1 に答える 1

5

次のメソッドを適用して元に戻すことができますArrayWritable(私の以前の回答から取得、こちらを参照) 。

public static <T extends Writable> T asWritable(byte[] bytes, Class<T> clazz)
            throws IOException {
        T result = null;
        DataInputStream dataIn = null;
        try {
            result = clazz.newInstance();
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            dataIn = new DataInputStream(in);
            result.readFields(dataIn);
        }
        catch (InstantiationException e) {
            // should not happen
            assert false;
        }
        catch (IllegalAccessException e) {
            // should not happen
            assert false;
        }
        finally {
            IOUtils.closeQuietly(dataIn);
        }
        return result;
    }

このメソッドは、提供されたクラス タイプ トークンに基づいて、バイト配列を正しいオブジェクト タイプに逆シリアル化するだけです。
例: カスタム ArrayWritable があると仮定しましょう:

public class TextArrayWritable extends ArrayWritable {
    public TextArrayWritable() {
      super(Text.class);
    }
}

ここで、単一の HBase get を発行します。

...
Get get = new Get(row);
Result result = htable.get(get);
byte[] value = result.getValue(family, qualifier);
TextArrayWritable tawReturned = asWritable(value, TextArrayWritable.class);
Text[] texts = (Text[]) tawReturned.toArray();
for (Text t : texts) {
  System.out.print(t + " ");
}
...

注: WritableUtils で readCompressedStringArray ()およびwriteCompressedStringArray()
メソッド を既に見つけている可能性があります。これらは、独自の String 配列に基づく Writable クラスがある場合に適しているようです。これらを使用する前に、gzip 圧縮/解凍によるオーバーヘッドが原因でパフォーマンスに深刻な影響を与える可能性があることを警告します。

于 2013-04-21T18:48:28.220 に答える