Подтвердить что ты не робот

Команда, подобная SQL LIMIT в HBase

Есть ли у HBase какая-либо команда, которая работает как запрос SQL LIMIT?

Я могу сделать это с помощью setStart и setEnd, но я не хочу перебирать все строки.

4b9b3361

Ответ 2

Имеется фильтр под названием 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

Ответ 3

Если используется HBase Shell, для ограничения результатов запроса может использоваться следующая команда: "LIMIT" должен быть заключен в одинарные кавычки.

scan 'table-name', {'LIMIT' => 10}

Ответ 4

Гарантированный способ - сделать ограничение на стороне клиента внутри цикла итератора. Это подход, применяемый в оболочке Rubber Shell HBase. Из таблицы .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(новый PageFilter (limit)) и scan.setCaching(limit), а затем table.getScanner(scan). Фильтр страницы гарантирует, что каждый сервер региона вернется максимум в предельные строки, предел кэширования сканирования гарантирует, что каждый сервер области будет читать вперед и кеширует не более "предельных" строк, а затем проверка предельных значений цикла клиента может разорвать цикл после получая первые "предельные" строки в порядке, полученном клиентом.