web-dev-qa-db-ja.com

HBaseのSQL LIMITのようなコマンド

HBaseには、SQL LIMITクエリ?

setStartsetEndでできますが、すべての行を繰り返したくありません。

47
Mohammad

HBase Shellから、LIMITを使用できます。

_hbase> scan 'test-table', {'LIMIT' => 5}
_

Java APIからScan.setMaxResultSize(N)またはscan.setMaxResultsPerColumnFamily(N)を使用できます。

85
th30z

PageFilterと呼ばれるフィルターがあります。この目的のためのものです。

Scan scan = new Scan(Bytes.toBytes("smith-"));
scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("givenName"));
scan.addColumn(Bytes.toBytes("contactinfo"), Bytes.toBytes("email"));
scan.setFilter(new PageFilter(25));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
    // ...
}

http://Java.dzone.com/articles/handling-big-data-hbase-part-4

13
mirsik

HBase Shellを使用する場合、次のコマンドを使用してクエリ結果を制限できます。「LIMIT」は一重引用符で囲む必要があります。

scan 'table-name', {'LIMIT' => 10}
6
Animesh Raj Jha

保証された方法は、反復子ループ内でクライアント側で制限を行うことです。これは、HBase Ruby Shell。From table.rb($ HBASE_HOME/hbase-Shell/src/main/Ruby/hbase/table.rb)で行われたアプローチです。行467:

  # Start the scanner
  scanner = @table.getScanner(_hash_to_scan(args))
  iter = scanner.iterator

  # Iterate results
  while iter.hasNext
    if limit > 0 && count >= limit
      break
    end

    row = iter.next
    ...
 end

Scan.setFilter(new PageFilter(limit))とscan.setCaching(limit)を追加してからtable.getScanner(scan)を追加することで、もう少し効率的にすることができます。ページフィルターは、各リージョンサーバーが最大で制限された行を返すことを保証し、スキャンキャッシュ制限は各リージョンサーバーが先読みして最大で「制限」行をキャッシュすることを保証します。クライアントが受け取った順序で最初の「制限」行を取得します。

1
devarajaswami

HBase 1.2では、Scan.setMaxResultSize(N)は行数制限のパラメーターとして機能しない場合があります。 maxResultSizeは、結果の最大サイズをバイト単位で制限します(クライアント側にキャッシュされます)。 ResultScanner.next(int nbRows)が反復中に行番号を制限できることがわかりました。

0
delphi.xk