有没有办法检索给定范围内的行键而不实际检索与该行键关联的列/ CF?
澄清:在我的示例中,我们的表格的行键是股票代码名称(例如GOOG),在我们的网络应用程序中,我们只想使用行键填充自动完成小部件有在数据库中。显然,如果我们在用户输入“G”时检索G和H之间所有股票的所有数据(而不仅仅是股票名称),我们将不必要地使我们的系统紧张。有什么想法吗?
答案 0 :(得分:9)
查看过滤器(http://hbase.apache.org/book/client.filter.html),尤其是KeyOnlyFilter。过滤器的说明(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/package-summary.html)是
仅返回每个KV的关键组件的过滤器(该值将被重写为空)。
为了限制特定范围内的键,请使用Scan(rowStart,rowEnd)构造函数。
答案 1 :(得分:7)
根据官方文档,您可以使用两个过滤器的组合来最佳地仅检索行键:KeyOnlyFilter和FirstKeyOnlyFilter。 (我认为" FirstKeyOnlyFilter"只会返回一次键,即使是大而复杂的行。)如果你只想要给定范围内的键,你可以将该范围添加到扫描仪。
以下是一些示例代码:
FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL,
new FirstKeyOnlyFilter(),
new KeyOnlyFilter());
Scan s = new Scan(filters);
// in order to limit the scan to a range
s.setStartRow(startRowKey); // first key in range
s.setStopRow(stopRowKey); // key value after the last key in the range
来源: https://hbase.apache.org/book.html#perf.hbase.client.rowkeyonly
答案 2 :(得分:1)
我会创建一个名为'empty:'的列族,并为所有行存储空值。现在,您可以只是请求加载列'empty:'。这不是理想的,但它比装载具有大量数据的列族更好。
答案 3 :(得分:0)
你可以使用addFamily(byte [] family)或addFamily(byte [] family,byte []限定符)来检索相关数据
答案 4 :(得分:0)
一种方法是维护另一个索引表,该索引表具有所有库存的所有可能FSA状态的密钥。因此,下次每当用户键入“G”时,您只需点击此表并检索可能是与G相关的所有值的逗号分隔列表。