Ответ 1
С помощью RegexStringComparator. Вам нужно придумать RegEx, который соответствующим образом фильтрует ваши даты. На этой странице приведен пример установки фильтра для сканера MapReduce.
Мне нужно написать задание MapReduce, которое получает все строки в заданном диапазоне дат (например, последний месяц). Это был бы прозвище, когда My Row Key начинался с Date. Но мои частые запросы Hbase начинаются с значений ключа.
Ключ "Моя строка" в точности A | B | C | 20120121 | D. Если комбинация A/B/C вместе с датой (в формате YearMonthDay) делает уникальный идентификатор строки.
Мои таблицы Hbase могут иметь до нескольких миллионов строк. Должен ли мой Mapper читать всю таблицу и фильтровать каждую строку, если она попадает в заданный диапазон дат, или Scan/Filter может помочь справиться с этой ситуацией?
Может ли кто-нибудь предложить (или фрагмент кода) способ эффективно справиться с этой ситуацией?
Спасибо -Panks
С помощью RegexStringComparator. Вам нужно придумать RegEx, который соответствующим образом фильтрует ваши даты. На этой странице приведен пример установки фильтра для сканера MapReduce.
RowFilter с RegEx Filter будет работать, но не будет самым оптимальным решением. В качестве альтернативы вы можете попробовать использовать вторичные индексы.
Еще одно решение - попробовать FuzzyRowFIlter. FuzzyRowFilter использует своего рода ускоренную пересылку, поэтому пропускает много строк в общем процессе сканирования и, таким образом, будет быстрее, чем сканирование RowFilter. Вы можете прочитать об этом здесь.
Альтернативно, BloomFilters также могут помочь в зависимости от вашей схемы. Если ваши данные огромны, вам следует провести сравнительный анализ вторичного индекса и фильтров цветка.
Я только начинаю с HBase, фильтры цветения может помочь.
Вы можете изменить Сканирование, которое вы отправляете в 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)
, чтобы добавить фильтры к сканированию.