Как эффективно сканировать HBase-строки

Мне нужно написать задание MapReduce, которое получает все строки в заданном диапазоне дат (например, последний месяц). Это был бы прозвище, когда My Row Key начинался с Date. Но мои частые запросы Hbase начинаются с значений ключа.

Ключ "Моя строка" в точности A | B | C | 20120121 | D. Если комбинация A/B/C вместе с датой (в формате YearMonthDay) делает уникальный идентификатор строки.

Мои таблицы Hbase могут иметь до нескольких миллионов строк. Должен ли мой Mapper читать всю таблицу и фильтровать каждую строку, если она попадает в заданный диапазон дат, или Scan/Filter может помочь справиться с этой ситуацией?

Может ли кто-нибудь предложить (или фрагмент кода) способ эффективно справиться с этой ситуацией?

Спасибо -Panks

Ответ 1

С помощью RegexStringComparator. Вам нужно придумать RegEx, который соответствующим образом фильтрует ваши даты. На этой странице приведен пример установки фильтра для сканера MapReduce.

Ответ 2

RowFilter с RegEx Filter будет работать, но не будет самым оптимальным решением. В качестве альтернативы вы можете попробовать использовать вторичные индексы.

Еще одно решение - попробовать FuzzyRowFIlter. FuzzyRowFilter использует своего рода ускоренную пересылку, поэтому пропускает много строк в общем процессе сканирования и, таким образом, будет быстрее, чем сканирование RowFilter. Вы можете прочитать об этом здесь.

Альтернативно, BloomFilters также могут помочь в зависимости от вашей схемы. Если ваши данные огромны, вам следует провести сравнительный анализ вторичного индекса и фильтров цветка.

Ответ 4

Вы можете изменить Сканирование, которое вы отправляете в Mapper, чтобы включить фильтр. Если ваша дата также является меткой времени записи, легко:

Scan scan = new Scan();
scan.setTimeRange(minTime, maxTime);
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
     OutputKey.class, OutputValue.class, job);

Если дата в строке строки отличается от другой, вам нужно будет добавить фильтр к вашему сканированию. Этот фильтр может работать с столбцом или строкой. Я думаю, что это будет беспорядочно с ключом строки. Если вы поместите дату в столбец, вы можете сделать FilterList, где все условия должны быть истинными и использовать CompareOp.GREATER и a CompareOp.LESS. Затем используйте scan.setFilter(filterList), чтобы добавить фильтры к сканированию.