Hbase查询性能

Hbase查询性能,hbase,Hbase,我们有一个hasbe表,其中rowkey作为用户id+时间戳。大约70%的用例使用用户id作为扫描的一部分。但其他30%的场景并不依赖于用户id。这就像获取在此期间进行了更改的所有用户一样。目前,我们将时间戳存储为列,并使用Columnvaluefilter获取结果。有没有更好的办法 提前谢谢 问候,, Arul.如果您自己将时间戳写入表,而不是默认的hbase时间戳,则可以尝试添加开始和停止时间戳进行扫描 如果你知道确切的日期,或者在日期+小时之间搜索,我建议使用另一个过滤器,这个日期范围相对

我们有一个hasbe表,其中rowkey作为用户id+时间戳。大约70%的用例使用用户id作为扫描的一部分。但其他30%的场景并不依赖于用户id。这就像获取在此期间进行了更改的所有用户一样。目前,我们将时间戳存储为列,并使用Columnvaluefilter获取结果。有没有更好的办法

提前谢谢

问候,,
Arul.

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

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


您可以阅读此任务以了解支持范围的模糊行过滤器。它已打开多年,并且有一个补丁。

在我的场景中,rowkey包含以毫秒为单位的时间戳,因此无法使用模糊的行筛选器。但是输入很有用,我可以在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);
List ranges=new ArrayList();
for(字符串用户:用户){
字符串startRowKey=user+HbaseConstants.ROW\u KEY\u separator+startTimeStamp;
字符串endRowKey=user+HbaseConstants.ROW\u KEY\u分隔符+endTimeStamp;
添加(新的行范围(Bytes.toBytes(startRowKey),true,Bytes.toBytes(endRowKey),false));
}
MultiRowRangeFilter rangeFilter=新的MultiRowRangeFilter(范围);
FilterList FilterList=新的FilterList(FilterList.Operator.MUST\u PASS\u ALL);
filterList.addFilter(rangeFilter);
scan.setFilter(过滤器列表);