【问题标题】:Get HBase Row Keys in Range without Retrieving Data?在不检索数据的情况下获取范围内的 HBase 行键?
【发布时间】:2015-05-27 03:06:15
【问题描述】:

有没有办法在不实际检索与该行键关联的列/CF 的情况下检索给定范围内的行键?

澄清:在我的示例中,我们表格的行键是股票代码名称(例如 GOOG),在我们的网络应用程序中,我们希望仅使用我们的行键填充一个自动完成小部件数据库中有。显然,如果我们在用户键入“G”时检索 G 和 H 之间所有股票的所有数据(而不仅仅是股票名称),我们将不必要地使我们的系统紧张。有什么想法吗?

【问题讨论】:

    标签: hbase


    【解决方案1】:

    根据官方文档,您可以使用两个过滤器的组合以最佳方式仅检索行键: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】:

      查看过滤器 (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) 构造函数。

      【讨论】:

        【解决方案3】:

        我将创建一个名为“empty:”的列族,并为所有行存储空值。现在,您只需请求加载“空:”列。这并不理想,但它比加载包含大量数据的列族要好。

        【讨论】:

          【解决方案4】:

          您可以使用 addFamily(byte[] family) 或 addFamily(byte[] family,byte[] qualifier) 来检索相关数据

          【讨论】:

            【解决方案5】:

            一种方法是维护另一个索引表,其中包含所有股票的所有可能 FSA 状态的键。因此,下次每当用户输入“G”时,您所要做的就是点击此表并检索可能是与 G 相关的所有值的逗号分隔列表。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-08-25
              • 2013-04-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多