【发布时间】:2016-10-22 23:04:52
【问题描述】:
通常建议通过startrow 和stoprow 使用范围扫描,而不是Rowkey Prefix Filter(例如here)。这是因为Rowkey Prefix Filter 会导致对行键进行全表扫描,而通过startrow 和stoprow 进行的范围扫描不会导致全表扫描。为什么不呢?大多数人说“因为 rowkey 是按字典顺序存储的”,这当然不能解释为什么 Rowkey Prefix Filter 不能利用这一点。
无论如何,通过startrow 和stoprow 的范围扫描究竟如何不会导致行键的全表扫描?
以python中的这个小例子来说明为什么我不明白行键的字典顺序在避免全表扫描时有何意义:
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()
显然,HBase 算法与此不同。怎么样?
TLDR:在使用 startrow 和 stoprow 进行范围扫描时,HBase 如何避免全表扫描?
【问题讨论】: