我正在设计一个在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中执行此操作?
通常建议使用范围扫描,startrow而stoprow不是Rowkey Prefix Filter(例如,这里).这样做的原因是因为Rowkey Prefix Filter导致对行键进行全表扫描,而范围扫描通过startrow并且stoprow不会导致全表扫描.为什么不呢?大多数人都说"因为rowkey以字典顺序存储",这当然不能解释为什么 Rowkey Prefix Filter不能利用这个.
在任何情况下,范围扫描的确切方式是什么,startrow而stoprow不是导致rowkey的全表扫描?
以python中的这个小例子来说明为什么我不理解rowkeys的lexagraphical排序在避免全表扫描方面意味着什么:
rowkeys = ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
def range_scan(startrow, stoprow):
is_found = False
for rowkey in rowkeys:
if startrow <= rowkey < stoprow:
is_found = True
yield rowkey
else:
if is_found:
raise StopIteration()
Run Code Online (Sandbox Code Playgroud)
显然,HBase算法与此不同.怎么做的?
TLDR:在使用startrow和stoprow进行范围扫描时,HBase究竟是如何避免全表扫描的?