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);
...
1条答案
按热度按时间wkftcu5l1#
我试图用phoenix来模拟您的问题,我不确定structrowkeybuilder是如何创建和存储键的,但如果您使用分隔的hbase键或使用phoenix composite实现相同的功能,您应该能够得到正确的结果。
我就是这么做的-
下一步创建以下查询-
下面是我的结果,我可以使用hbase javaapi实现同样的结果,但在我的例子中,生成的复合键是由分隔符“0”分隔的串联字符串。在我看来,structrowkeybuilder正在改变一些东西,因为您试图实现的是非常正常的用例场景。
希望这有帮助。