【问题标题】:Hbase query performanceHbase 查询性能
【发布时间】:2015-12-22 13:51:16
【问题描述】:

我们有以行键作为用户 ID + 时间戳的 hasbe 表。我们大约 70% 的用例使用用户 ID 作为扫描的一部分。但其他 30% 的场景不依赖于用户 id。这就像获取在这段时间之间进行过更改的所有用户。目前我们将时间戳存储为列并使用 Columnvaluefilter 来获取结果。有没有更好的方法来做到这一点。

提前致谢。

问候, 阿鲁尔。

【问题讨论】:

    标签: hbase


    【解决方案1】:

    您可以尝试将开始和停止时间戳添加到 Scan,如果您自己将时间戳写入表,而不是默认的 hbase 时间戳。

    如果您知道确切的日期或要搜索的日期+小时,并且此日期范围相对较小,我建议您使用另一个过滤器。 FuzzyRowFilter,可以使用,但不幸的是它没有范围模式,所以当我用它来搜索日期时,由于我的行键中有 yyyyMMddHH 模式,我可以在范围内每小时添加一个模糊过滤器来扫描对象,但这不适合您最终使用 10 个过滤器。但是如果你有时间你可以试试,因为现在使用列值过滤意味着对每个查询进行全表扫描。

    您可以阅读此任务以了解支持模糊行过滤器的范围。 https://issues.apache.org/jira/browse/HBASE-6618 已开放多年,确实有补丁。

    【讨论】:

      【解决方案2】:

      在我的场景中,rowkey 包含以毫秒为单位的时间戳,并且由于此模糊行过滤器无法使用。但是输入很有用,我可以在行键包含日期的其他用例中尝试。在我的用例中,数据被提取并显示在带有分页逻辑的 html 表中。我完全知道需要从 Hbase 检索这些数据的用户。鉴于此,我继续实施范围过滤器并且效果很好。请在下面找到代码。

      List<RowRange> ranges = new ArrayList<RowRange>();
                      for(String user: users){
                          String startRowKey = user + HbaseConstants.ROW_KEY_SEPERATOR + startTimeStamp;
                          String endRowKey = user + HbaseConstants.ROW_KEY_SEPERATOR +endTimeStamp;
                          ranges.add(new RowRange(Bytes.toBytes(startRowKey), true, Bytes.toBytes(endRowKey), false));
                      }
      
                      MultiRowRangeFilter rangeFilter = new MultiRowRangeFilter(ranges);
      
                      FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
                      filterList.addFilter(rangeFilter);
                      scan.setFilter(filterList);
      

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 1970-01-01
        • 2012-04-20
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多