Частичное сканирование строки строки в HBase - PullRequest
0 голосов
/ 08 мая 2018

В моем развертывании hbase мне нужен следующий ключ строки:

EquipmentNumber | LogTime

например: 454312 | 20180304124511

Теперь я хочу выполнить частичное сканирование ключей строк, т.е. я хочу сканировать только в диапазоне LogTime

например, я хочу получить все номера оборудования между временем входа t1 и t2?

Может ли любое тело помочь, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

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

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

Для автоматического управления индексами вы можете попробовать Phoenix, вы можете создать таблицу Phoenix с глобальным индексом на logTime, вот небольшой пример -

CREATE TABLE "SO50228751"(
"equipNum" integer not null,
"logtime" bigint not null,
"f"."data" varchar
CONSTRAINT pk PRIMARY KEY ("equipNum", "logtime")); 

Добавить данные

upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124511,'a');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124512,'b');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124513,'c');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124514,'d');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124515,'e');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124521,'f');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124522,'g');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124523,'h');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454313,20180304124524,'i');
upsert into "SO50228751"("equipNum", "logtime","f"."data")  values(454312,20180304124524,'ii');

Создать индекс

CREATE INDEX so_idx ON "SO50228751"(logtime);

Запрос по logTime с использованием индекса

select /*+ /*+ INDEX("SO50228751" so_idx) */ * from "SO50228751" where "logtime" between 20180304124511 and 20180304124516;

Прежде чем принять решение о выборе индексов Phoenix, пожалуйста, проверьте документацию и эту ссылку -> https://community.hortonworks.com/articles/61705/art-of-phoenix-secondary-indexes.html, чтобы понять, насколько хорошо они подходят для вашего варианта использования.

Надеюсь, это поможет.

0 голосов
/ 13 мая 2018

HBase строки сортируются в алфавитном порядке, поэтому вы можете сканировать по префиксу, но вы не можете сканировать по суффиксу.

Одна вещь, которую вы можете сделать, это сканировать всю таблицу с помощью RowFilter - записать логику фильтра на основе вашего поля LogTime. Он будет фильтровать строки на сервере, поэтому ваш клиентский код получит только правильные строки.

...