分层rowkey上的hbase shell过滤器(或按rowkey长度过滤)

时间:2017-03-22 13:45:22

标签: regex shell filter hbase row-key

我有一个分层的行键设计,其中每个字符都是一个字段的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

1 个答案:

答案 0 :(得分:0)

一般:

  • 您的正则表达式字符串仅匹配3个字符-> 000或001
    -例如'regexstring:^ 00。{2} $'将匹配4个字符/数字-> 0000
  • 为什么没有使用

    这样的刹车器?

    扫描'tbl',{ROWPREFIXFILTER =>'row2',FILTER => QualifierFilter(> =,'binary:abc'))}

  • 为什么不使用RowPrefixFilter(而不是STARTROW和PrefixFilter)?

关于3。:

您必须屏蔽正则表达式字符串(就像在Java中一样):

RowFilter(=,'regexstring:^\\d{4}$')

关于1。:

我只会想象没有结束$的查询优化会让HBase返回一个范围(可以通过哈希快速找到),但是如果您需要确切的长度,HBase必须再次检查相关范围内的所有条目(保留并添加所有资源以完成任务)。