HBaseのJava APIのResultクラスは、テーブルから取ってきたデータ(複数のKeyValue)を保持するクラス。
|
Result#getFamilyMap()やgetNoVersionMap()といったメソッドが返すMap(NavigableMap)のキーの型はバイト配列(byte[])となっている。[2010-03-01]
しかし配列のequals()やhashCode()はObjectの内容そのままなので、別インスタンスであれば別物という扱いになってしまい、そのままであればMapのキーには使えない。
HBaseの場合、このMapの実体はTreeMapであり、コンパレーターにBytes.BYTES_COMPARATORを指定したものになっている。
なのでバイト配列をキーとしても、ちゃんとMapとして使用できる。
NavigableMap<byte[], 〜> map = new TreeMap<byte[], 〜>(Bytes.BYTES_COMPARATOR);
Resultから全データを取得する一番効率のよい方法は、Result#raw()を使うこと。[2010-03-01]
KeyValue[] kvs = result.raw();
KeyValue[] kvs = result.sorted();
List<KeyValue> list = result.list();
raw()は、Result内部のデータをKeyValueの配列にして返す。(一度配列化したら、内部でキャッシュされる)
sorted()は、raw()をキーでソートして返す。一度ソートすれば、raw()が返す配列もソートされたものになる。
list()は、sorted()をListにしたものを返す。
Result#getMap()は内部ではraw()と同じKeyValue[]を元にしてマップを作っている。
Mapを返す系統のメソッドでは、getMap()で取得したMapを使い回すのが一番効率が良い。
なぜなら、getFamilyMap()やgetNoVersionMap()といったメソッドでは、内部でgetMap()を呼んだ後に返却用のMapインスタンスを生成して内容をコピーしているから。
(getMap()自身は一度呼ばれたら作ったマップのインスタンスをキャッシュしているので、何度呼び出しても特に問題ない)
Result#getValue(family,
qualifier)も内部ではgetMap()を呼んでいる。
HBase0.20のResult#getValue(column)は内部でcolumnをfamilyとqualifierに分割しているので、最初から分かれているなら分けたまま呼ぶ方がいい。
※getValue(column)は、HBase0.89で廃止された。[2010-07-11]
Result#getBytes()で取得した値は、Resultのコンストラクターに渡すことが出来る。
ただしgetBytes()で返される値は初期化されていないことがあるようなので、isEmpty()やsize()を事前に呼んでおいた方がいいかも。
if (!result.isEmpty()) { ImmutableBytesWritable bytes = result.getBytes(); Result r = new Result(bytes); }