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

Scan

HBaseJava APIScanクラスは、サーバーからデータを取得する際の条件を指定するクラス。
この条件判定は、サーバー側で行われる。


Scanの使用方法の基本形

Scanのインスタンスを作り、条件をセットする。
そしてHTable#getScanner()でデータ取得を実行する。
返ってきたResultScannerをループさせてデータを取得する。

import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
	Scan scan = new Scan();
	scan.set条件(〜);

	ResultScanner rs = table.getScanner(scan);
	try {
		for (Result r : rs) {
			String row = Bytes.toString(r.getRow());

			for (KeyValue kv : r.raw()) {
				String fam = Bytes.toString(kv.getBuffer(), kv.getFamilyOffset(),    kv.getFamilyLength());
				String qua = Bytes.toString(kv.getBuffer(), kv.getQualifierOffset(), kv.getQualifierLength());
				String val = Bytes.toString(kv.getBuffer(), kv.getValueOffset(),     kv.getValueLength());

				System.out.printf("%s\t%s:%s\t%s%n", row, fam, qua, val);
			}
		}
	} finally {
		rs.close();
	}

Scanのメソッド

指定内容 コーディング例 備考
全件取得
Scan scan = new Scan();
無条件に全データを取得する。
ROW範囲指定
byte[] start = Bytes.toBytes("KEY00002");
Scan scan = new Scan(start);
byte[] start = Bytes.toBytes("KEY00002");
Scan scan = new Scan();
scan.setStartRow(start);
先頭となる行キーを指定し、それ以降のデータを全て取得する。
(取得されるデータには、指定された行キーが含まれる)

SQLの「select * from テーブル where ROW>='KEY00002'」に相当。
byte[] stop = Bytes.toBytes("KEY00003");
Scan scan = new Scan(HConstants.EMPTY_START_ROW, stop);
byte[] stop = Bytes.toBytes("KEY00003");
Scan scan = new Scan();
scan.setStopRow(stop);
停止条件となる行キーを指定し、それより前のデータを全て取得する。
(取得されるデータには、指定された行キーは含まれない)

SQLの「select * from テーブル where ROW<'KEY00003'」に相当。
byte[] start = Bytes.toBytes("KEY00002");
byte[] stop  = Bytes.toBytes("KEY00004");
Scan scan = new Scan(start, stop);
先頭行と停止行を指定し、その範囲のデータを取得する。
取得されるデータには、指定された先頭行は含まれるが停止行は含まれない。
ただし先頭行キーと停止行キーが同じ値の場合は、その行だけ取得される。

SQLの「select * from テーブル where 'KEY00002'<=ROW and ROW<'KEY00004'」に相当。
Get指定
byte[] row = Bytes.toBytes("KEY00002");
Get  get  = new Get(row);
Scan scan = new Scan(get);
Getと同じ条件でスキャンする。
(Getの場合(startとstopが等しい場合)、scan.isGetScan()が真になる)

SQLの「select * from テーブル where ROW='KEY00002'」に相当。
列ファミリー指定
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes("ColumnFamilyA"));
指定された列ファミリー(に属する全カラム)だけ取得する。
(addメソッドなので、複数の列ファミリーを指定できる)
カラム指定
Scan scan = new Scan();
scan.addColumn(
	Bytes.toBytes("ColumnFamilyA"),
	Bytes.toBytes("Column1")
);
指定されたカラム(family:qualifier)だけ取得する。
(addメソッドなので、複数のカラムを指定できる)

SQLの「select "ColumnFamilyA:Column1" from テーブル」に相当。
タイムスタンプ指定
Scan scan = new Scan();
long minStamp = 1280055530265L;
long maxStamp = 1280055582093L;
scan.setTimeRange(minStamp, maxStamp);
Scan scan = new Scan();
scan.setTimeStamp(1280055530265L);
タイムスタンプを指定して、その範囲のデータを取得する。
minStamp≦時刻<maxStampのデータが取得される。

setTimeStamp()の場合、時刻が一致するデータだけが取得される。
バージョン数指定
Scan scan = new Scan();
scan.setMaxVersions(3);
Scan scan = new Scan();
scan.setMaxVersions();
取得する履歴(バージョン)の個数を指定する。
引数なしの場合、保持されている全履歴を取得する。
履歴の個数を特に指定しない場合のデフォルトは1、
つまり最新バージョンしか取得しない。
フィルター
byte[] start = Bytes.toBytes("KEY00001");
Filter filter = new 〜;
Scan scan = new Scan(start, filter);
Filter filter = new 〜;
Scan scan = new Scan();
scan.setFilter(filter);
フィルター(細かい条件)を指定する。
Filterクラス
データ数上限
Scan scan = new Scan();
scan.setBatch(1000);
一回のnext()呼び出しで取得されるデータ数の上限?を指定する。
filterRow()でフィルターするFilterを使っている場合は指定できない。
HBase0.89以降
キャッシュ行数
Scan scan = new Scan();
scan.setCaching(100);
サーバーとの通信においてクライアント側でキャッシュされる行数を指定する。
大きくするとスキャンが速くなるが、メモリーをより使用するようになる。
指定しない場合はHTable#getScannerCaching()の値が使用される。
(デフォルトは1(hbase-site.xmlのhbase.client.scanner.cachingの値))

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