Фильтр HBase по части ключа строки
Это моя таблица (Key — это byte[] с использованием StructRowKeyBuilder с FixedLengthByteWritable для «a», IntWritable для идентификатора и LongWritable для метки времени и содержит в основном всю информацию, значение — это просто счетчик) Ключ состоит из идентификатора (a или p), идентификатор переменной длины, дата со временем в секундах и несколько других идентификаторов после этого (о которых мне все равно, так как я хочу фильтровать по времени).
KEY VALUE
a 13 2018-01-01T10:00:00 ... 1
a 13 2018-01-02T11:00:00 ... 1
a 13 2018-01-03T12:00:00 ... 1
a 13 2018-01-04T13:00:00 ... 1
a 15 2018-01-01T10:00:00 ... 1
a 15 2018-01-02T11:00:00 ... 1
a 15 2018-01-03T12:00:00 ... 1
a 123 2018-01-01T10:00:00 ... 1
a 123 2018-01-02T11:00:00 ... 1
a 123 2018-01-03T12:00:00 ... 1
a 123 2018-01-04T10:00:00 ... 1
...
p 13 2018-01-01T10:00:00 ... 1
p 13 2018-01-02T10:00:00 ... 1
p 13 2018-01-03T10:00:00 ... 1
p 666 2018-01-01T10:00:00 ... 1
...
Я хочу получить все данные за определенный период времени, скажем, между 2018-01-01T10:00:00 и 2018-01-02T12:00:00 для всех a.
Итак, я попытался настроить сканирование в начале и конце строки.
StartRow **a 0 2018-01-01T10:00:00**
EndRow **a Integer.MAX_VALUE 2018-01-02T:12:00:01 (+1 second to make it inclusive)**
Это не дало мне правильного результата, так как включало все, что находится между двумя ключами. Так что запись
КЛЮЧ ЗНАЧЕНИЕ a 13 2018-01-04T13:00:00 ... 1
тоже был включен. (Что имеет смысл)
Установка начальной строки на a 0
и конечной строки на целое число. MaxValue
ограничивает количество возвращаемых строк до a
s.
Как мне фильтровать эти строки на стороне сервера с помощью фильтров HBase? Поскольку ключи сериализуются в byte[], у меня нет четкого представления о том, как добиться этого с помощью фильтров.
Любой, кто мог бы указать мне в правильном направлении? (или еще лучше предоставить пример кода в java)
Некоторый код (который, к сожалению, не работает так, как я хочу):
...
byte[] fromKey = Bytes.toBytes("a" + 0);
byte[] toKey = Bytes.toBytes("a" + Integer.MAX_VALUE);
Scan scan = new Scan(fromKey, toKey);
int minId = 0;
int maxId = Integer.MAX_VALUE;
final byte[] fromBytes = Bytes.toBytes("a" + minId + dateFromInMillis);
final BinaryPrefixComparator fromBinaryPrefixComparator = new BinaryPrefixComparator(fromBytes);
final Filter fromFilter = new RowFilter(CompareOp.GREATER_OR_EQUAL, fromBinaryPrefixComparator);
final byte[] toBytes = Bytes.toBytes("a" + maxId + dateFromInMillis);
final BinaryPrefixComparator toBinaryPrefixComparator = new BinaryPrefixComparator(toBytes);
final Filter toFilter = new RowFilter(CompareOp.LESS_OR_EQUAL, toBinaryPrefixComparator);
FilterList filterList= new FilterList(FilterList.Operator.MUST_PASS_ALL, fromFilter, toFilter);
scan.setFilter(filterList);
scanner = myTable.getScanner(scan);
...