不知道为什么用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
最佳答案
HBase 过滤器 - 甚至行过滤器 - 真的很慢,因为在大多数情况下,它们会执行完整的表扫描,然后对这些结果进行过滤。看看这个讨论:http://grokbase.com/p/hbase/user/115cg0d7jh/very-slow-scan-performance-using-filters
然而,行键范围扫描确实要快得多——它们相当于一个过滤表扫描。这是因为行键是按排序的顺序存储的(这是HBase的基本保证之一,它是一种类似BigTable的解决方案),所以对行键的范围扫描非常快。更多解释在这里:http://www.quora.com/How-feasible-is-real-time-querying-on-HBase-Can-it-be-achieved-through-a-programming-language-such-as-Python-PHP-or-JSP
[更新 1] 结果表明 PrefixFilter 会执行全表扫描,直到它通过过滤器中使用的前缀(如果找到)。使用 PrefixFilter 获得快速性能的建议似乎是在 PrefixFilter 之外指定 start_row 参数。见 related 2013 discussion on the hbase-user mailing list .
[更新 2,来自@aaa90210] 关于上述更新,现在有一个高效的行前缀过滤器,它比 PrefixFilter 快得多,请参阅此答案:https://stackoverflow.com/a/38632100/150050
关于performance - 我应该在 HBase 中使用 prefixfilter 还是 rowkey 范围扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942638/