[英]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.