Фильтр оболочки 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 должен снова проверить все записи в соответствующем диапазоне (со всеми ресурсами). зарезервировано и добавлено для выполнения задачи).

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