HBase(简易版):如何在HBase shell中执行范围前缀扫描

34

我正在设计一个运行在hbase上的应用程序,并想要交互式地探索集群的内容。我在hbase shell中,想要执行一次扫描,以获取所有以字符“abc”开头的键。这样的键可能包括“abc4”,“abc92”,“abc20014”等...我尝试过扫描。

hbase(main):003:0> scan 'mytable', {STARTROW => 'abc', ENDROW => 'abc'}

但是这似乎并没有返回任何内容,因为技术上不存在行键为“abc”,只有以“abc”开头的行键。

我想要的是像这样的东西:

hbase(main):003:0> scan 'mytable', {STARTSROWPREFIX => 'abc', ENDROWPREFIX => 'abc'}

我听说HBase可以快速地完成这个任务,这也是它的主要卖点之一。在hbase shell中,我该如何做到这一点?

4个回答

56

结果证明这很容易。扫描范围不包括在内,逻辑是 start <= key < end。因此答案是:

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}

没错 - 看起来你是通过艰难的方式找到了答案。 :) 你想将其标记为正确答案吗? - Suman
然而,HBase文档应该说明startrow实际上是startrowprefix。 - nir
2
如果您的行只使用“ASCII”值,那么它就像您在这里描述的那样简单。如果您真的使用二进制行键,则变得更加困难。请查看此处https://issues.apache.org/jira/browse/HBASE-11990,以了解尝试创建通用解决方案时出现的讨论和边缘情况。 - Niels Basjes
这个{STARTROW => 'abc', ENDROW => 'abd'}有Java API等效吗?我只找到了PrefixFilter,但这种范围类似的方法更适合我。 - user3091996

44

在最近版本的HBase中,您现在可以在hbase shell中执行以下操作:

scan 'mytable', {ROWPREFIXFILTER => 'abc'}

这实际上就是这样做的(也适用于二进制情况)

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}

使用这种方法比“PrefixFilter”方法更加高效,因为后者会将所有记录都通过存在于这个PrefixFilter类中的比较代码。


2
我对PrefixFilter的作用感到困惑,因为startrow和stoprow似乎更加优越。您知道任何使用情况吗?我还听说人们将这三种方法结合在一起。 - Matthew Moisen
我再也不使用PrefixFilter了。也许在协处理器中执行某些操作时使用它是有好处的,否则我甚至会投票将该类从HBase中删除。 - Niels Basjes
1
很遗憾,我一直在使用它,因为我错误地认为你需要在起始行和结束行上有一个精确匹配。我对26个不同的行键前缀分割的500万行进行了测试,并且对我来说,前缀过滤器平均慢了300%。现在我正在把所有的任务都重构一遍,度过我的周六 :) - Matthew Moisen
不确定您是否知道答案,但我想把它发送给您:https://dev59.com/2Zvga4cB1Zd3GeqP8d1Q - Matthew Moisen

26

被接受的解决方案并不能在所有情况下(二进制键)都起作用。此外,使用PrefixFilter可能会很慢,因为它执行表扫描直到达到前缀为止。更高效的解决方案是使用STARTROW和FILTER, 如下所示:

 scan 'my_table', {STARTROW => 'abc', FILTER => "PrefixFilter('abc')"}

我不太理解PrefixFilter的作用,因为startrowstoprow似乎更优秀。你知道有什么使用案例吗?我也听说过有人将这三个结合起来使用。 - Matthew Moisen
这是对我有效的解决方案。我的键由AAA_B_CCC组成。我需要所有以AAA_开头的行。 - Amro Younes

1

我认为过滤器比范围扫描慢得多。https://dev59.com/Bmgu5IYBdhLWcg3w9ryX. 有没有一种方法可以使用范围扫描来完成这个任务? - David Williams
1
@DavidWilliams:是的,范围查询更快。 - Tariq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接