2013-04-25 158 views
4

我想知道HBase是否支持RowKey扫描中的通配符。类似的东西来:对RowKey中通配符的HBase支持

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

我明白,我们可以使用部分键扫描,如果我们有到rowkey前缀的一些知识(和HBase的是非常有效的与该扫描)。但是,如果我们没有前缀信息(这意味着搜索键可能在RowKey中的任何位置),那么Hbase必须运行全表扫描,是否正确?

另外,我怎样才能在HBase(无论是代码还是通过shell)形成这样的查询?

回答

4

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

说你有这样的数据:

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 

所以,你可以做基于前缀的匹配,而不是后缀为基础的。希望这是有用的。

+0

谢谢你的回复网速慢,但我的问题是关于如果我们没有前缀的信息和我们的搜索键可在rowkey的任何部分。我认为在这种情况下HBase不是高性能的,并且需要全表扫描。我只是想确认一下。谢谢! – Prashant 2013-07-10 04:06:26

+0

是的,你可以使用列过滤器,但我相信这需要全表扫描。 – Suman 2013-07-10 14:23:33

0

您可以将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