HBase 有没有类似SQL LIMIT
查询的命令?
我可以通过setStart
and来做到这一点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 中采用的方法。从 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),可以提高效率。页面过滤器将确保每个区域服务器最多返回limit行,扫描缓存限制将确保每个区域服务器将提前读取并缓存最多'limit'行,然后客户端循环限制检查可以在之后打破循环按客户端收到的顺序获取第一个“限制”行。
在 HBase 1.2 中,Scan.setMaxResultSize(N)
可能不作为行数限制的参数。maxResultSize 限制以字节为单位的最大结果大小(缓存在客户端)。我发现ResultScanner.next(int nbRows)
可以在迭代期间限制行数。