Использование Scan в HBase с начальной строкой, конечной строкой и фильтром
Мне нужно использовать Scan в HBase для сканирования всех строк, которые соответствуют определенным критериям: вот почему я буду использовать фильтр (на самом деле составной список фильтров, который включает в себя два SingleColumnValueFilter). Теперь мои rowKeys структурированы следующим образом:
a.b.x|1|1252525
a.b.x|1|2373273
a.b.x|1|2999238
...
a.b.x|2|3000320
a.b.x|2|4000023
...
a.b.y|1|1202002
a.b.y|1|1778949
a.b.y|1|2738273
и как дополнительное требование, мне нужно перебирать только те строки, у которых есть rowKey, начинающийся с "abx|1"
Теперь вопросы
- если я использую дополнительный PrefixFilter в моем списке фильтров, всегда ли сканер сканирует все строки (и к каждой из них применяется фильтр)?
- если я создаю экземпляр Scan, передавая startRow (префикс) и список фильтров (без PrefixFilter), я понимаю, что сканирование начинается с заданного префикса строки. Итак, предположим, что я использую "abx" в качестве startRow, сканирование будет сканировать также aby?
- Каково поведение, если я использую новый Scan(startRow, endRow), а затем setFilter? Другими словами: как насчет отсутствующего конструктора Scan (начало байта [], конец байта [], фильтр фильтра)?
заранее спасибо
Andrea
1 ответ
Клавиши строк отсортированы (лексические) в hbase. Следовательно, все "abx|1" должны предшествовать "abx|2" и т. Д. Так как ключи строк хранятся в виде байтовых массивов и лексикографически сортируются, будьте осторожны с ключами строк не фиксированной длины и при перепутывании разные классы персонажей. Но по вашему требованию что-то на этой линии должно работать:
Scan scan = new Scan(Bytes.toBytes("a.b.x|1"),Bytes.toBytes("a.b.x|2"); //creating a scan object with start and stop row keys
scan.setFilter(colFilter);//set the Column filters you have to this scan object.
//And then you can get a scanner object and iterate through your results
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next())
{
//Use the result object
}
обновление: ToBytes должен быть toBytes