57

HBase 有没有类似SQL LIMIT查询的命令?

我可以通过setStartand来做到这一点setEnd,但我不想迭代所有行。

4

5 回答 5

103

在 HBase shell 中,您可以使用 LIMIT:

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

在 Java API 中,您可以使用Scan.setMaxResultSize(N)scan.setMaxResultsPerColumnFamily(N).

于 2012-12-22T13:05:33.113 回答
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

于 2014-02-20T08:18:57.530 回答
7

如果使用 HBase Shell,可以使用以下命令限制查询结果:“LIMIT”必须用单引号括起来。

scan 'table-name', {'LIMIT' => 10}
于 2014-02-27T21:22:40.887 回答
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),可以提高效率。页面过滤器将确保每个区域服务器最多返回limit行,扫描缓存限制将确保每个区域服务器将提前读取并缓存最多'limit'行,然后客户端循环限制检查可以在之后打破循环按客户端收到的顺序获取第一个“限制”行。

于 2015-01-24T21:46:20.917 回答
0

在 HBase 1.2 中,Scan.setMaxResultSize(N)可能不作为行数限制的参数。maxResultSize 限制以字节为单位的最大结果大小(缓存在客户端)。我发现ResultScanner.next(int nbRows)可以在迭代期间限制行数。

于 2019-03-14T08:42:24.710 回答