Я пытался эмулировать вашу проблему с помощью Phoenix, я не уверен, как StructRowKeyBuilder создает и сохраняет ключ, но если вы реализуете его, используя ключ HBase с разделителями или композитный Phoenix, вы сможете получить правильные результаты.
Вот что я сделал -
// Create table
create table stackoverflow (
id1 char(1) not null,
id2 integer not null,
eventdate Date not null,
id3 varchar not null,
id4 varchar not null,
myvalue integer
CONSTRAINT my_pk PRIMARY KEY (id1, id2, eventdate,id3, id4));
// add data
UPSERT INTO stackoverflow (id1, id2, eventdate,id3, id4, myvalue) VALUES('a', 13, '2018-01-01T10:00:00', 'dummy1', 'dummy2', 1);
.
.
.
UPSERT INTO stackoverflow (id1, id2, eventdate,id3, id4, myvalue) VALUES('p', 13, '2018-01-03T12:00:00', 'dummy1', 'dummy2', 1);
UPSERT INTO stackoverflow (id1, id2, eventdate,id3, id4, myvalue) VALUES('p', 666, '2018-01-01T10:00:00', 'dummy1', 'dummy2', 1);
Следующий созданный следующий запрос -
select * from stackoverflow where id1='a' and id2 between 0 and 2147483647 and eventdate between TO_DATE('2018-01-01T10:00:00') and TO_DATE('2018-01-02T12:00:01');
Вот мои результаты, я могу достичь того же, используя HBase Java API, но в моем случае сгенерированный составной ключ представляет собой сцепленную строку, разделенную разделителем «0». Мне кажется, что StructRowKeyBuilder что-то меняет, потому что то, что вы пытаетесь достичь, является очень нормальным сценарием использования.
a 13 2018-01-01 10:00:00.000 dummy1 dummy2 1
a 13 2018-01-02 11:00:00.000 dummy1 dummy2 1
a 15 2018-01-01 10:00:00.000 dummy1 dummy2 1
a 15 2018-01-02 11:00:00.000 dummy1 dummy2 1
a 123 2018-01-01 10:00:00.000 dummy1 dummy2 1
a 123 2018-01-02 11:00:00.000 dummy1 dummy2 1
Надеюсь, это поможет.