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