HBaseには、SQL LIMIT
クエリ?
setStart
とsetEnd
でできますが、すべての行を繰り返したくありません。
HBase Shellから、LIMITを使用できます。
_hbase> scan 'test-table', {'LIMIT' => 5}
_
Java APIからScan.setMaxResultSize(N)
またはscan.setMaxResultsPerColumnFamily(N)
を使用できます。
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
HBase Shellを使用する場合、次のコマンドを使用してクエリ結果を制限できます。「LIMIT」は一重引用符で囲む必要があります。
scan 'table-name', {'LIMIT' => 10}
保証された方法は、反復子ループ内でクライアント側で制限を行うことです。これは、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)を追加することで、もう少し効率的にすることができます。ページフィルターは、各リージョンサーバーが最大で制限された行を返すことを保証し、スキャンキャッシュ制限は各リージョンサーバーが先読みして最大で「制限」行をキャッシュすることを保証します。クライアントが受け取った順序で最初の「制限」行を取得します。
HBase 1.2では、Scan.setMaxResultSize(N)
は行数制限のパラメーターとして機能しない場合があります。 maxResultSizeは、結果の最大サイズをバイト単位で制限します(クライアント側にキャッシュされます)。 ResultScanner.next(int nbRows)
が反復中に行番号を制限できることがわかりました。