我想知道 HBase 是否支持 RowKey 扫描的通配符。类似于:
select * from TABLE where KEY like '%SEARCH_KEY%';
我知道如果我们对行键的前缀有一些了解,我们可以使用部分键扫描(并且 HBase 在该扫描方面非常有效)。但是,如果我们没有前缀信息(意味着搜索键可以在 RowKey 中的任何位置),那么 Hbase 必须运行全表扫描,对吗?
另外,如何在 HBase 中形成这样的查询(代码或通过 shell)?
我想知道 HBase 是否支持 RowKey 扫描的通配符。类似于:
select * from TABLE where KEY like '%SEARCH_KEY%';
我知道如果我们对行键的前缀有一些了解,我们可以使用部分键扫描(并且 HBase 在该扫描方面非常有效)。但是,如果我们没有前缀信息(意味着搜索键可以在 RowKey 中的任何位置),那么 Hbase 必须运行全表扫描,对吗?
另外,如何在 HBase 中形成这样的查询(代码或通过 shell)?
您只能进行基于前缀的行键扫描。
假设您有如下数据:
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
因此,您可以进行基于前缀的匹配,但不能进行基于后缀的匹配。希望这是有用的。
您可以将 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);
而不是 SingleColumnValueFilter 使用 RowFilter