Фильтр оболочки hbase для иерархического ключа строки (или фильтр по длине ключа строки)
У меня есть иерархическая конструкция ключа строки, где каждый символ является идентификатором поля (мы используем 4-байтовые сегменты, но я буду придерживаться двузначных цифр для удобства чтения)
Например
00
0000 = ребенок от 00
000000 = ребенок от 0000
0001 = ребенок от 00
000100 = ребенок от 0001
Я хотел бы сделать запрос оболочки hbase, чтобы вернуть дочерние элементы узла.
Прямо сейчас у меня есть следующее
scan 'tableName', STARTROW=>'00',
FILTER=>"PrefixFilter('00') AND RowFilter(=,'regexstring:^00.{1}$')"
который дает список детей от 00, а именно 0000 0001
Здесь есть более одного вопроса:
1. Если я уберу знак $, производительность резко улучшится (с 2 секунд до 0,2 секунды на локальной виртуальной машине), но я также получу дополнительные результаты (000000 и 000100, результаты мне не нужны). Есть ли причина для такого резкого снижения производительности? (поскольку это должен быть дополнительный фильтр в суженном списке)
2. Есть ли способ фильтрации по длине ключа строки? (тогда я могу отказаться от регулярных выражений и использовать только startrow/endrow) - это нужно сделать в оболочке hbase. Например, FILTER => "RowKeyLengthFilter (4)"
3. Я не могу использовать слово (\w) или цифру (\d) в строке регулярного выражения, есть ли ограничение для оболочки hbase? Также пробовал с [[:alnum:]] и [[:digit:]] (спасибо за Yunnosch за предложение)
версия = 1.1.0.1, r4de7d45cb593f98ae5d020080cbc7116d3e9d9a0, вс 17 мая 12:52:10 PDT 2015
0 ответов
В общем:
- Ваша строка регулярного выражения соответствует только 3 символам -> 000 или 001
- например, 'regexstring:^00.{2}$' будет соответствовать 4 символам / цифрам -> 0000 есть ли причина, по которой вы не используете такие браслеты, как
scan 'tbl', {ROWPREFIXFILTER => 'row2', FILTER => QualifierFilter (>=, 'binary:abc')) }
почему вы не используете RowPrefixFilter (вместо STARTROW и PrefixFilter)?
в отношении 3.:
Вы должны замаскировать строку регулярного выражения (как вы делаете, например, в Java):
RowFilter(=,'regexstring:^\\d{4}$')
относительно 1.:
Я только хотел бы изобразить, что оптимизация запроса без окончания $ позволяет HBase возвращать вам диапазон (который можно быстро найти с помощью хеширования), но если вам требуется точная длина, HBase должен снова проверить все записи в соответствующем диапазоне (со всеми ресурсами). зарезервировано и добавлено для выполнения задачи).