HBase (Easy): как выполнить сканирование префикса диапазона в оболочке hbase

Я разрабатываю приложение для работы на hbase и хочу интерактивно исследовать содержимое моего кластера. Я нахожусь в оболочке hbase и хочу выполнить сканирование всех ключей, начинающихся с символов «abc». Такие ключи могут включать «abc4», «abc92», «abc20014» и т. Д. Я пробовал сканировать

hbase(main):003:0> scan 'mytable', {STARTROW => 'abc', ENDROW => 'abc'}

Но, похоже, это ничего не возвращает, поскольку технически нет клавиши строки «abc», только клавиши строки, начинающиеся с «abc».

Я хочу что-то вроде

hbase(main):003:0> scan 'mytable', {STARTSROWPREFIX => 'abc', ENDROWPREFIX => 'abc'}

Я слышал, что HBase может сделать это быстро и является одним из его главных преимуществ. Как мне это сделать в оболочке hbase?


person David Williams    schedule 09.07.2013    source источник


Ответы (4)


Оказывается, это очень просто. Диапазоны сканирования не включают, логика - начало ‹= ключ‹ конец. Итак, ответ

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}
person David Williams    schedule 09.07.2013
comment
Правильно - похоже, вы выяснили это на собственном горьком опыте. :) Вы хотите отметить это как правильный ответ? - person Suman; 11.07.2013
comment
однако документ hbase должен сказать, что startrow на самом деле является startrowprefix - person nir; 13.05.2014
comment
Если в ваших строках используются только значения ASCII, это так же просто, как вы здесь описываете. Если вы действительно используете двоичные клавиши-строки, это станет намного сложнее. Проверьте здесь issues.apache.org/jira/browse/HBASE-11990, чтобы посмотрите, какие обсуждения и крайние случаи выявили попытки создать универсальное решение. - person Niels Basjes; 29.09.2014

В последних версиях HBase теперь вы можете делать в оболочке hbase:

scan 'mytable', {ROWPREFIXFILTER => 'abc'}

Это эффективно делает это (а также работает для двоичных ситуаций)

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}

Этот метод НАМНОГО более эффективен, чем подход «PrefixFilter», поскольку последний пропускает все записи через код сравнения, который присутствует в этом классе PrefixFilter.

person Niels Basjes    schedule 28.07.2016
comment
У меня проблемы с пониманием назначения PrefixFilter, когда startrow и stoprow кажутся лучше. Вы знаете какие-нибудь варианты использования? Я также слышал, что люди сочетают все три. - person Matthew Moisen; 22.10.2016
comment
Я больше никогда не использую PrefixFilter. Возможно, есть веская причина использовать его при выполнении чего-либо в сопроцессоре, иначе я бы даже проголосовал за полное удаление класса из HBase. - person Niels Basjes; 22.10.2016
comment
К сожалению, я использовал его все это время, потому что ошибочно предположил, что вам нужно иметь точное совпадение в начальной и конечной строках. Я провел тест на 5 миллионах строк, разделенных между 26 различными префиксами rowkey, и фильтр префиксов для меня в среднем примерно на 300% медленнее. Сейчас я трачу субботу на рефакторинг всех своих работ :) - person Matthew Moisen; 23.10.2016
comment
Не уверен, что вы знаете ответ на этот вопрос, но я решил, что отправлю его вам: stackoverflow.com/questions/ 40197883 / - person Matthew Moisen; 23.10.2016

Принятое решение не будет работать во всех случаях (бинарные ключи). Кроме того, использование PrefixFilter может быть медленным, потому что он выполняет сканирование таблицы, пока не достигнет префикса. Более эффективное решение - использовать STARTROW и FILTER следующим образом:

 scan 'my_table', {STARTROW => 'abc', FILTER => "PrefixFilter('abc')"}
person Ben English    schedule 30.10.2015
comment
Мне трудно понять цель PrefixFilter, когда startrow и stoprow кажутся лучше. Вы знаете какие-нибудь варианты использования? Я также слышал, что люди сочетают все три. - person Matthew Moisen; 22.10.2016
comment
Это решение, которое сработало для меня. Мой ключ состоит из AAA_B_CCC. Мне нужны были все строки, где ключ начинался с AAA_. - person Amro Younes; 11.05.2017

Я думаю, что тебе нужен фильтр

ознакомьтесь с ответом на следующий вопрос Сканировать с помощью фильтра с использованием оболочки HBase

другие фильтры перечислены в http://hbase.apache.org/book/client.filter.html

person Mehul Rathod    schedule 09.07.2013
comment
Я считаю, что фильтры намного медленнее, чем сканирование диапазона. stackoverflow.com/questions/10942638/. Есть ли способ сделать это с помощью сканирования диапазона? - person David Williams; 10.07.2013
comment
@DavidWilliams: Да, запросы диапазона быстрее. - person Tariq; 10.07.2013