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

Dav*_*ams 30 hbase database-scan

我正在设计一个在hbase上运行的应用程序,并希望以交互方式浏览我的集群的内容.我在hbase shell中,我想要以字符"abc"开头扫描所有键.这样的键可能包括"abc4","abc92","abc20014"等......我试过扫描

hbase(main):003:0> scan 'mytable', {STARTROW => 'abc', ENDROW => 'abc'}
Run Code Online (Sandbox Code Playgroud)

但这似乎没有返回任何东西,因为从技术上讲没有rowkey"abc"只有以"abc"开头的rowkeys

我想要的是类似的东西

hbase(main):003:0> scan 'mytable', {STARTSROWPREFIX => 'abc', ENDROWPREFIX => 'abc'}
Run Code Online (Sandbox Code Playgroud)

我听说HBase能够迅速做到这一点,并且是其主要卖点之一.我如何在hbase shell中执行此操作?

Dav*_*ams 49

事实证明这很容易.扫描范围不包括在内,逻辑是开始<= key <end.所以答案是

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的行仅使用"ASCII"值,那么它就像您在此处描述的那样简单.如果你真的使用二进制rowkeys那么它会变得更加困难.请点击此处https://issues.apache.org/jira/browse/HBASE-11990查看试图创建通用解决方案的讨论和边缘案例. (2认同)

Nie*_*jes 31

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

scan 'mytable', {ROWPREFIXFILTER => 'abc'}
Run Code Online (Sandbox Code Playgroud)

这有效地做到了这一点(也适用于二进制情况)

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'}
Run Code Online (Sandbox Code Playgroud)

此方法比"PrefixFilter"方法更有效,因为后者通过此PrefixFilter类中的比较代码放置所有记录.

  • 我很难理解PrefixFilter的用途,当startrow和stoprow看起来更优越时.你知道任何用例吗?我也听说人们将这三者结合起来. (2认同)

Ben*_*ish 23

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

 scan 'my_table', {STARTROW => 'abc', FILTER => "PrefixFilter('abc')"}
Run Code Online (Sandbox Code Playgroud)