S-JIS[2010-07-11] 変更履歴

Result

HBaseJava APIResultクラスは、テーブルから取ってきたデータ(複数のKeyValue)を保持するクラス。


Resultが返すMapについて

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から全データを取得する一番効率のよい方法は、Result#raw()を使うこと。[2010-03-01]

  1. KeyValue[] kvs = result.raw();
  2. KeyValue[] kvs = result.sorted();
  3. 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);
	}

Java APIへ戻る / HBaseへ戻る / Java目次へ行く / 技術メモへ戻る
メールの送信先:ひしだま