次のメソッドを適用して元に戻すことができます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 圧縮/解凍によるオーバーヘッドが原因でパフォーマンスに深刻な影響を与える可能性があることを警告します。