Hbase查询性能

时间:2015-12-22 13:51:16

标签: hbase

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

提前致谢。

此致 了Arul。

2 个答案:

答案 0 :(得分:0)

如果您自己向表中写入时间戳,则可以尝试向扫描添加开始和停止时间戳,而不是默认的hbase timestampig。

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

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

答案 1 :(得分:0)

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

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);