HBase - значение фильтра со смещением? - PullRequest
0 голосов
/ 13 сентября 2018

Допустим, у меня есть три строки со следующими значениями:

+------+----------+
| row  | f1:c1    |
+------+----------+
| row1 | \x00\x00 |
| row2 | \x01\x00 |
| row3 | \x03\x01 |
+------+----------+

Можно ли выбрать строки с \x00 в качестве второго байта значения (например, row1 и row2)?

Дальнейшее объяснение

У меня есть неизменный объект, который состоит из пары UUID s как части моей сущности.Поскольку UUID имеет фиксированную длину, наиболее эффективным способом хранения является объединение всех частей в один байтовый массив и сохранение его в одном столбце.

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

На самом деле ByteArrayComparable уже вроде как работает.Он принимает смещение, которое указывает на начало значения, и кажется, что все, что мне нужно, это добавить дополнительное смещение поверх этого.Но я не могу понять, как это сделать.

В общем, мне кажется, что это широко применимый вариант использования.Таким образом, должен быть способ сделать это, если я что-то упустил.

PS Я знаю, что, вероятно, смогу достичь того, чего хочу, с RegexStringComparator, но это кажется дико неэффективным.

ОБНОВЛЕНИЕ

HBase поддерживает пользовательские фильтры, которые идеально подходят для моей ситуации.К сожалению, вся документация, которую я могу найти, кажется устаревшей, поскольку hbase.dynamic.jars.dir и hbase.use.dynamic.jar отсутствуют в моей конфигурации (моя версия 2.0.1).

ОБНОВЛЕНИЕ 2

Мне удалось решить эту проблему с помощью пользовательского фильтра.Похоже, что они удалили hbase.dynamic.jars.dir и hbase.use.dynamic.jar, но простое размещение фильтра на пути к классам работает нормально.

Если кто-то захочет написать ответ о том, как реализовать и использовать пользовательский фильтр, я с удовольствиемприсудить награду.

1 Ответ

0 голосов
/ 22 сентября 2018

Во-первых, давайте узнаем больше о пользовательских фильтрах, чтобы ответить на это предложение:

P.S. Я знаю, что, возможно, смогу достичь того, чего хочу, с помощью RegexStringComparator, но это кажется крайне неэффективным.

пользовательские фильтры могут использоваться в операции сканирования в HBase. Когда такая операция сканирования выполняется из вашего приложения, например, при включенном искре, исполнитель использует RPC-соединение для соединения с базовым сервером региона, а региональный сервер использует тот же тип соединения для извлечения данных из узла данных. Но вопрос в том, где применяются пользовательские фильтры? по вашему заявлению? Конечно же нет. Пользовательские фильтры применяются к строкам на региональных серверах, и только подходящие фильтры подходят для вашего приложения. Кроме того, это означает, что использование таких фильтров очень поможет в решении проблем производительности.

Во-вторых, если необходимо выбрать несколько строк на основе их значений, вы можете использовать различные виды фильтров, но SingleColumnValueFilter может быть гораздо более полезным при работе со значениями. Полный список пользовательских фильтров представлен здесь . Кроме того, RegexStringComparator может использоваться как компаратор SingleColumnValueFilter, и вот пример:

RegexStringComparator regexStringComparator=
                new RegexStringComparator(regexPattern);
SingleColumnValueFilter singleColumnValueFilter=
                new SingleColumnValueFilter(family, qualifier, 
                               CompareOp.EQUAL, regexStringComparator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...