structrowkey byte[]数组键上的hbase筛选器

5hcedyr0  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(437)

hbase按部分行键筛选
这是我的表(键是byte[],使用structrowkeybuilder,fixedlengthbytewritable for'a',intwritable for the id and longwritable for the timestamp,包含基本上所有的信息,值只是一个计数器)键由一个标识符(a或p)组成,一个长度可变的id,一个以秒为单位的日期,以及之后的几个其他ID(我不太在乎,因为我想过滤时间)。

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);
...
wkftcu5l

wkftcu5l1#

我试图用phoenix来模拟您的问题,我不确定structrowkeybuilder是如何创建和存储键的,但如果您使用分隔的hbase键或使用phoenix composite实现相同的功能,您应该能够得到正确的结果。
我就是这么做的-

// 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 javaapi实现同样的结果,但在我的例子中,生成的复合键是由分隔符“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

希望这有帮助。

相关问题