我有一个分层的行键设计,其中每个字符都是一个字段的ID(我们使用4个字节的段,但为了便于阅读,我会坚持使用两位数字)
例如
00
0000 = 00的孩子
000000 = 0000的孩子
0001 = 00的孩子
000100 = 0001的孩子
我想创建一个hbase shell查询来返回节点的子节点。
现在我有以下
scan 'tableName', STARTROW=>'00',
FILTER=>"PrefixFilter('00') AND RowFilter(=,'regexstring:^00.{1}$')"
给出了00的子项列表,即 0000 0001
这里有一个以上的问题:
1。如果我删除$符号,性能会显着提高(在本地VM上从2秒到0.2秒),但我也得到了额外的结果(000000和000100,我不需要的结果)。这种戏剧性的性能下降是否有原因? (因为它应该是缩小列表中的附加过滤器)
2。有没有办法按rowkey的长度过滤? (然后我可以抛弃正则表达式并仅使用startrow / endrow) - 这必须在hbase shell中完成。例如FILTER =>“RowKeyLengthFilter(4)”
3。我不能在正则表达式字符串中使用单词(\ w)或数字(\ d),是否有hbase shell的限制?也尝试了[[:alnum:]]和[[:digit:]](感谢Yunnosch的建议)
version = 1.1.0.1,r4de7d45cb593f98ae5d020080cbc7116d3e9d9a0,Sun May 17 12:52:10 PDT 2015
答案 0 :(得分:0)
一般:
为什么没有使用
这样的刹车器?扫描'tbl',{ROWPREFIXFILTER =>'row2',FILTER => QualifierFilter(> =,'binary:abc'))}
为什么不使用RowPrefixFilter(而不是STARTROW和PrefixFilter)?
关于3。:
您必须屏蔽正则表达式字符串(就像在Java中一样):
RowFilter(=,'regexstring:^\\d{4}$')
关于1。:
我只会想象没有结束$的查询优化会让HBase返回一个范围(可以通过哈希快速找到),但是如果您需要确切的长度,HBase必须再次检查相关范围内的所有条目(保留并添加所有资源以完成任务)。