Сканирование HBase — фильтры RowKey

Итак, давайте посмотрим, смогу ли я кратко объяснить мою проблему.

Представьте, что у нас есть таблица HBase, содержащая информацию о каждом посещении дискотеки: каждая дискотека регистрирует свое имя, имя посетителя и день< /em> он посетил его. (да, это глупый пример, я знаю..).

Так, например, это будут некоторые значения таблицы:

..
ministryOfSoundJamesOliver01022017
ministryOfSoundJamesOliver02022017
ministryOfSoundJamesOliver03022017
ministryOfSoundOliviaNewton04042017
ministryOfSoundOliviaNewton06042017
...
pachaibizaJohnMcKiness06042017
pachaibizaJohnMcKiness04042017
pachaibizaWilliamForrester04042017
..

RowKey имеет следующую структуру:

discoName

имя человека

ДеньГода

(в таблице есть некоторые другие столбцы/квалификаторы, но я не возражаю против них в этой проблеме).


Проблема в следующем: представьте мальчика, которому просто нравится ходить в Министерство звука. Ему это просто нравится, он тратит все свои деньги на дискотеки и наркотики (но здесь не в этом дело).

Моя цель — вывести всех, кто посещал Министерство звука. В моем сканировании этот чувак постоянно появляется в результатах, поэтому я должен отбросить много записей в поисках следующего посетителя. ФЭ:

..
ministryOfSoundJohnnyYonkie01022017
ministryOfSoundJohnnyYonkie02022017
ministryOfSoundJohnnyYonkie03022017
ministryOfSoundJohnnyYonkie04022017
ministryOfSoundJohnnyYonkie05022017
ministryOfSoundAnotherDude02022017
...

Чтобы зарегистрировать AnotherDude, я должен удалить 4 записи от Johnny.

Наконец, вопрос:


Есть ли способ сообщить HBase, что повторяющиеся записи от байта (x) до байта (x + y) [ x — количество байтов от discoName и y количество байтов от personName] должны быть < strong>автоматически отбрасывается?


Заранее большое спасибо!!


person aran    schedule 08.03.2017    source источник
comment
Какова схема доступа к данным? Используете ли вы Hadoop и MapReduce или просто сканируете таблицу с помощью клиентского API HBase? Вы хотите пропускать записи на стороне сервера HBase или на стороне клиента, чтобы функция обработки данных принимала только уникальные записи диско-пользователя? Я не совсем понял сценарий.   -  person AdamSkywalker    schedule 14.03.2017
comment
Привет, @AdamSkywalker! Мы подключаемся к Hbase через клиентский API (используя экономию и C#), и наша цель — пропустить записи на стороне сервера. Спасибо!   -  person aran    schedule 15.03.2017
comment
Рассматривали ли вы возможность создать новое сканирование с данным startKey, чтобы пропустить записи? Например, когда вы находите JohnnyYonkie, вы создаете новое сканирование с ключом запуска «ministryOfSoundJohnnyYonkie99999».   -  person AdamSkywalker    schedule 15.03.2017
comment
это умная идея @AdamSkywalker Ты выглядишь умным. Так держать братан.   -  person aran    schedule 12.09.2017


Ответы (1)


Перво-наперво: если у вас есть только клиентский доступ, я не могу вам помочь :(

Если у вас есть дополнительный доступ, вы можете рассмотреть следующие предложения, но ответ по умолчанию будет таким: Если это ваш шаблон доступа, оптимизируйте схему для него.

Если вам нужно получить доступ к данным определенным образом, в первую очередь убедитесь, что вы записываете их таким образом. Используйте API уменьшения карты, если вам нужно выполнить миграцию.

Я бы, вероятно, просто добавил таблицу, которая просто записывает строку MinistryOfSound и столбец для каждого посетителя. (В общем, схема, которую вы предлагаете, звучит не очень хорошо для HBase, поскольку у вас есть куча записей с монотонно увеличивающимися ключами строк, если постобработка повторяющихся результатов действительно является проблемой производительности)

С другой стороны, если это специальный запрос, то вы, вероятно, захотите сразу же использовать mapreduce-API — возможно, используя Apache Spark-interconnect и выполнить «отдельный» вызов данных.

Я бы не стал использовать сканирование для аналитических запросов.

Если бы вам пришлось делать это с помощью сканирования, я бы рекомендовал вам реализовать сопроцессор. Они могут дополнять фильтр состоянием, и вы можете проецировать результаты сканирования PrefixFilter на стороне сервера региона. Если вы не знакомы с сопроцессорами, вот введение: HBase: полное руководство. Для этого необходимо, чтобы вы могли развертывать jar-файлы в пути к классам RegionServer.

Но опять же, если вы взорвете свой клиент, выполнив там четкую фильтрацию, вы, вероятно, также взорвете свои регионы из-за горячих точек на вставках.

В качестве последней альтернативы: вы можете взглянуть на Apache Phoenix и посмотреть, сможете ли вы преобразовать свой rowkey в схему, из которой вы можете выбрать отдельные первые две части rowkey. Это, очевидно, потребует, чтобы у вас был разделитель в ключе строки или, по крайней мере, фиксированная длина.

person Rick Moritz    schedule 16.03.2017
comment
не дошел до решения, но ваш пост был информативным, поэтому ставлю вам галочку - person aran; 12.09.2017