我有一个分层的行键设计,其中每个字符都是一个字段的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的长度过滤(然后我可以抛弃regex,只使用startrow/endrow)-这必须在hbase shell中完成。例如filter=>“rowkeylengthfilter(4)”
三。我不能在regex字符串中使用单词(\w)或数字(\d),hbase shell是否有限制?还尝试了:alnum:和:digit:(感谢yunnosch的建议)
版本=1.1.0.1,r4de7d45cb593f98ae5d020080cbc7116d3e9d9a0,星期日,2015年5月17日12:52:10 pdt
1条答案
按热度按时间8tntrjer1#
一般来说:
正则表达式字符串只匹配3个字符->000或001
--例如,“regexstring:^00.{2}$”将匹配4个字符/数字->0000
你为什么不使用像这样的刹车
扫描'tbl',{rowprefixfilter=>'row2',filter=>限定符筛选器(>=,'binary:')) }
为什么不使用rowprefixfilter(而不是startrow和prefixfilter)?
关于3:
您必须屏蔽regex字符串(例如在java中):
关于1:
我只想想象一下,查询优化没有结束$lets hbase会返回一个范围(通过散列可以很快找到),但如果您需要确切的长度,hbase必须再次检查相关范围内的所有条目(保留并添加所有资源以完成任务)。