0

我有一个分层的行键设计,其中每个字符都是一个字段的 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. 有没有办法按行键的长度进行过滤?(然后我可以放弃正则表达式并只使用 startrow/endrow) - 这必须在 hbase shell 中完成。例如 FILTER=>"RowKeyLengthFilter(4)"
3. 我不能在正则表达式字符串中使用单词 (\w) 或数字 (\d),hbase shell 有限制吗?还尝试了 [[:alnum:]] 和 [[:digit:]] (感谢 Yunnosch 的建议)

版本 = 1.1.0.1,r4de7d45cb593f98ae5d020080cbc7116d3e9d9a0,2015 年 5 月 17 日星期日 12:52:10 PDT

4

1 回答 1

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 必须再次检查相关范围内的所有条目(包含所有资源保留并添加以完成任务)。

于 2019-04-17T08:40:51.420 回答