像HBase中的SQL LIMIT一样的命令

时间:2012-12-22 12:45:20

标签: nosql hbase

HBase是否有任何类似SQL LIMIT查询的命令?

我可以通过setStartsetEnd来完成,但我不想迭代所有行。

5 个答案:

答案 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)可以限制迭代期间的行数。