【发布时间】:2015-05-27 03:06:15
【问题描述】:
有没有办法在不实际检索与该行键关联的列/CF 的情况下检索给定范围内的行键?
澄清:在我的示例中,我们表格的行键是股票代码名称(例如 GOOG),在我们的网络应用程序中,我们希望仅使用我们的行键填充一个自动完成小部件数据库中有。显然,如果我们在用户键入“G”时检索 G 和 H 之间所有股票的所有数据(而不仅仅是股票名称),我们将不必要地使我们的系统紧张。有什么想法吗?
【问题讨论】:
标签: hbase
有没有办法在不实际检索与该行键关联的列/CF 的情况下检索给定范围内的行键?
澄清:在我的示例中,我们表格的行键是股票代码名称(例如 GOOG),在我们的网络应用程序中,我们希望仅使用我们的行键填充一个自动完成小部件数据库中有。显然,如果我们在用户键入“G”时检索 G 和 H 之间所有股票的所有数据(而不仅仅是股票名称),我们将不必要地使我们的系统紧张。有什么想法吗?
【问题讨论】:
标签: hbase
根据官方文档,您可以使用两个过滤器的组合以最佳方式仅检索行键: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
【讨论】:
查看过滤器 (http://hbase.apache.org/book/client.filter.html),尤其是 KeyOnlyFilter。过滤器的描述(http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/package-summary.html)是
一个过滤器,只会返回每个KV的key分量(值会被改写为空)。
为了将键限制在特定范围内,请使用 Scan(rowStart, rowEnd) 构造函数。
【讨论】:
我将创建一个名为“empty:”的列族,并为所有行存储空值。现在,您只需请求加载“空:”列。这并不理想,但它比加载包含大量数据的列族要好。
【讨论】:
您可以使用 addFamily(byte[] family) 或 addFamily(byte[] family,byte[] qualifier) 来检索相关数据
【讨论】:
一种方法是维护另一个索引表,其中包含所有股票的所有可能 FSA 状态的键。因此,下次每当用户输入“G”时,您所要做的就是点击此表并检索可能是与 G 相关的所有值的逗号分隔列表。
【讨论】: