Использование 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"

Теперь вопросы

  1. если я использую дополнительный PrefixFilter в моем списке фильтров, всегда ли сканер сканирует все строки (и к каждой из них применяется фильтр)?
  2. если я создаю экземпляр Scan, передавая startRow (префикс) и список фильтров (без PrefixFilter), я понимаю, что сканирование начинается с заданного префикса строки. Итак, предположим, что я использую "abx" в качестве startRow, сканирование будет сканировать также aby?
  3. Каково поведение, если я использую новый 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

Другие вопросы по тегам