HBase是否有任何类似SQL LIMIT
查询的命令?
我可以通过setStart
和setEnd
来完成,但我不想迭代所有行。
答案 0 :(得分:82)
从HBase shell中可以使用LIMIT:
hbase> scan 'test-table', {'LIMIT' => 5}
在Java API中,您可以使用Scan.setMaxResultSize(N)
或scan.setMaxResultsPerColumnFamily(N)
。
答案 1 :(得分:13)
有一个名为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
答案 2 :(得分:6)
如果使用HBase Shell,可以使用以下命令来限制查询结果:“LIMIT”必须用单引号括起来。
scan 'table-name', {'LIMIT' => 10}
答案 3 :(得分:1)
保证的方法是在迭代器循环内对客户端进行限制。这是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),可以提高效率。页面过滤器将确保每个区域服务器将返回最多限制行,扫描缓存限制将确保每个区域服务器将提前读取并缓存最多“限制”行,然后客户端循环限制检查可以打破循环后按照客户收到的顺序获取第一个“限制”行。
答案 4 :(得分:0)
在HBase 1.2中,
Scan.setMaxResultSize(N)
不能用作行数限制的参数。 maxResultSize限制最大结果大小(以字节为单位)(缓存在客户端)。我发现ResultScanner.next(int nbRows)
可以限制迭代期间的行数。