如果我使用prefixfilter进行查询,我不知道为什么它会很慢.有人可以解释一下查询HBase的最佳方法,谢谢.
hbase(main):002:0> scan 'userlib',{FILTER=>org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes('0000115831F8'))}
ROW COLUMN+CELL
0000115831F8001 column=track:aid, timestamp=1339121507633, value=aaa
1 row(s) in 41.0700 seconds
hbase(main):002:0> scan 'userlib',{STARTROW=>'0000115831F8',ENDROW=>'0000115831F9'}
ROW COLUMN+CELL
0000115831F8001 column=track:aid, timestamp=1339121507633, value=aaa
1 row(s) in 0.1100 seconds
Run Code Online (Sandbox Code Playgroud) 我正在使用Java作为查询Hbase的客户端.
我的Hbase表设置如下:
ROWKEY | HOST | EVENT
-----------|--------------|----------
21_1465435 | host.hst.com | clicked
22_1463456 | hlo.wrld.com | dragged
. . .
. . .
. . .
Run Code Online (Sandbox Code Playgroud)
我需要做的第一件事是让所有的清单ROWKEYs已host.hst.com与它相关联.
我可以在Column上创建一个扫描器,host对于每个行值,column value = host.hst.com我将添加相应ROWKEY的列表.看起来效率很高.O(n)获取所有行.
现在是困难的部分.对于ROWKEY列表中的每一个,我需要得到相应的EVENT.
如果我使用普通GET命令来获取单元格(ROWKEY, EVENT),我相信会创建一个扫描程序EVENT,需要O(n)时间才能找到正确的单元格并返回值.这对每个人来说都是非常糟糕的时间复杂性ROWKEY.结合这两者给了我们O(n^2).
有没有更有效的方法来解决这个问题?
非常感谢您提前帮助!
因此,如果我在Bigtable中有以下数据:
DEL_6878 .....
DEL_6879 .....
BOM_5876 .....
SFO_8686 .....
SFO_8687 .....
Run Code Online (Sandbox Code Playgroud)
我如何查询SFO *记录?我阅读了文档;我知道如何获得单行;类似于以下内容:
table.get("SFO_8686");
Run Code Online (Sandbox Code Playgroud)
或如何获得范围;之类的东西getRows("SFO_8686", "SFO _8687")接受startKeyand endKey,但是我读了文档,使我相信一个人可以获得以前缀开头的记录。SFO *示例。我怎么做?
通常建议使用范围扫描,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究竟是如何避免全表扫描的?