- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
通常建议通过 startrow
和 stoprow
使用范围扫描,而不是 Rowkey Prefix Filter
(例如,here) .这样做的原因是因为 Rowkey Prefix Filter
会导致对 rowkey 进行全表扫描,而通过 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 究竟如何避免全表扫描?
最佳答案
在 HBase 中,一个表被分成多个区域。区域是由特定区域服务器提供服务的一组行。区域服务器具有(通常)来自多个表的多个区域,它处理请求。
因为行是按键排序的,所以在 hbase master 中知道哪些开始键和停止键是每个区域的边界,以及可以在哪个区域服务器上查询该区域。
因此,如果使用显式开始和停止行完成扫描,则查询将仅定向到具有可能在请求范围内的键的区域/区域服务器。
如果查询的键范围“很小”,那么您会发现几乎所有查询都只访问一个区域。
一个 HBase 表通常有几十个区域,通过使用开始和停止行来限制扫描,您可能会发现表的 100 个区域中有 99 个甚至不知道表上的查询已经完成完成。
关于hadoop - HBase中startrow和stoprow的使用如何不导致全表扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40197883/
下午好。目前我正在从查询中格式化一些 json,当我到达循环查询的地步时,我发现了一个非常奇怪的现象。我将 startrow 指定为 20,将 endrow 指定为 40。运行时,我在填充 20-40
我正在尝试使用 maatwebsite 的 laravel excel 包 2.0.8 为 Laravel 5.2 导入一个 excel 文件。我希望能够在我的 Controller 中而不是在配置中
我是一名优秀的程序员,十分优秀!