Есть ли у HBase какая-либо команда, которая работает как запрос SQL LIMIT
?
Я могу сделать это с помощью setStart
и setEnd
, но я не хочу перебирать все строки.
Есть ли у HBase какая-либо команда, которая работает как запрос SQL LIMIT
?
Я могу сделать это с помощью setStart
и setEnd
, но я не хочу перебирать все строки.
Из оболочки HBase вы можете использовать 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}
Гарантированный способ - сделать ограничение на стороне клиента внутри цикла итератора. Это подход, применяемый в оболочке 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). Фильтр страницы гарантирует, что каждый сервер региона вернется максимум в предельные строки, предел кэширования сканирования гарантирует, что каждый сервер области будет читать вперед и кеширует не более "предельных" строк, а затем проверка предельных значений цикла клиента может разорвать цикл после получая первые "предельные" строки в порядке, полученном клиентом.