web-dev-qa-db-ja.com

hbaseテーブルのすべての行キーをリストする方法は?

誰かがhbaseテーブルのすべての行キーをリストする方法を教えてもらえますか?

24
hbase_user

HBase Shellを使用して、すべての行キーをリストできます。

count 'table_name', { INTERVAL => 1 }
26
Haimei

これはかなり高速になるはずです(FirstKeyOnlyFilterはサーバーで実行され、結果をクライアントに送信する前にすべての列データを取り除きます)。

Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, tableName.getBytes());
System.out.println("scanning full table:");
Scan scan = new Scan();
scan.setFilter(new FirstKeyOnlyFilter());
ResultScanner scanner = table.getScanner(scan);
for (Result rr : scanner) {
  byte[] key == rr.getRow();
  ...
}
14
Geli
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, tableName.getBytes());

System.out.println("scanning full table:");
ResultScanner scanner = table.getScanner(new Scan());
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
  byte[] key == rr.getRow();
  ...
}
5
David

行キーのみが必要な(ファミリー、修飾子、値、タイムスタンプがない)テーブルスキャンを実行する場合は、setFilterを使用して、MUST_PASS_ALL演算子を含むFilterListをスキャナーに追加します。フィルターリストには、FirstKeyOnlyFilterとKeyOnlyFilterの両方を含める必要があります。このフィルターの組み合わせを使用すると、RegionServerがディスクから単一の値を読み取り、単一行のクライアントへのネットワークトラフィックが最小限になるという最悪のシナリオになります。

2

Resultクラスの getRow メソッドを使用します。その説明は言う:

このResultが作成された行に対応する行キーを取得するためのメソッド。

tableがhbaseテーブルであり、HBaseインスタンスに接続しているとすると、次のことを行うだけです。

Scan scan = new Scan();
ResultScanner rscanner = table.getScanner(scan);
for(Result r : rscanner){
   //r is the result object that contains the row
   //do something
   System.out.println(Bytes.toString(r.getRow())); //doing something
}

これは、Java APIの観点からすでに回答済みですが、もう少し詳しく説明しても誰にも害を及ぼすことはないことを理解しています。

2

PHPでHBase thriftクライアントを使用したいようです。以下はサンプルコードであり、HBaseのすべてのデータを取得して、それらの行キーを取得できます。

<? $_SERVER['PHP_ROOT'] = realpath(dirname(__FILE__).'/..');
   require_once $_SERVER['PHP_ROOT'].'/flib/__flib.php';
   flib_init(FLIB_CONTEXT_SCRIPT);
   require_module('storage/hbase');
   $hbase = new HBase('<server_name_running_thrift_server>', <port on which thrift server is running>);
   $hbase->open();
   $client = $hbase->getClient();
   $result = $client->scannerOpenWithFilterString('table_name', "(PrefixFilter ('row2') AND (QualifierFilter (>=, 'binary:xyz'))) AND (TimestampsFilter ( 123, 456))");
   $to_print = $client->scannerGetList($result,1);
   while ($to_print) {
      print_r($to_print);
      $to_print = $client->scannerGetList($result,1);
    }
   $client->scannerClose($result);
?>
1
tobe