繁体   English   中英

HBase筛选器上的StructRowKey byte []数组键

[英]HBase Filter on StructRowKey byte[] Array key

HBase按行键过滤

这是我的表(键是使用StructRowKeyBuilder的byte [],其中'a'为FixedLengthByteWritable,ID为IntWritable,时间戳为LongWritable,并且基本上包含所有信息,值只是一个计数器)键由一个标识符(一个或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 ,将结束行设置为Integer。 MaxValue限制传回的行数a秒。

如何使用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);
...

我尝试使用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        

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM