【问题标题】:HBase support for wildcards in RowKeyHBase 对 RowKey 中的通配符的支持
【发布时间】:2013-04-25 01:51:37
【问题描述】:

我想知道 HBase 是否在 RowKey 扫描中支持通配符。类似于:

select * from TABLE where KEY like '%SEARCH_KEY%';

我知道如果我们对行键的前缀有一些了解,我们可以使用部分键扫描(并且 HBase 在该扫描方面非常有效)。但是,如果我们没有前缀信息(意味着搜索键可以在 RowKey 中的任何位置),那么 Hbase 必须运行全表扫描,对吗?

另外,如何在 HBase 中形成这样的查询(代码或通过 shell)?

【问题讨论】:

    标签: hbase


    【解决方案1】:

    您只能进行基于前缀的行键扫描。

    假设您有如下数据:

    aaa_001
    aaa_002
    aab_001
    aac_001
    baa_001
    ...
    zzz_001
    

    使用HappyBase,你可以这样写代码得到aaa*

    for key in table.scan(row_prefix="aaa"):
      print key
    

    将打印

    aaa_001
    aaa_002
    

    而这段代码:

    for key in table.scan(row_prefix="aa"):
      print key
    

    会给你这个:

    aaa_001
    aaa_002
    aab_001
    aac_001
    

    因此您可以进行基于前缀的匹配,但不能进行基于后缀的匹配。希望这有用。

    【讨论】:

    • 感谢 Suman 的回复,但是我的问题是关于我们是否没有前缀信息以及我们的搜索键可能在行键的任何部分。我认为 HBase 在这种情况下性能不佳,需要进行全表扫描。我只是想确认一下。谢谢!
    • 是的,您可以使用列过滤器,但我认为这需要全表扫描。
    【解决方案2】:

    您可以将 RegexStringComparator 与 RowFilter 一起使用并指定正则表达式,但是它将以全表扫描结束。

    RegexStringComparator comp = new RegexStringComparator("my.");   // any value that starts with 'my'
    SingleColumnValueFilter filter = new SingleColumnValueFilter(
    cf,
    column,
    CompareOp.EQUAL,
    comp
    );
    scan.setFilter(filter);
    

    使用 RowFilter 代替 SingleColumnValueFilter

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多