【发布时间】:2015-12-22 13:51:16
【问题描述】:
我们有以行键作为用户 ID + 时间戳的 hasbe 表。我们大约 70% 的用例使用用户 ID 作为扫描的一部分。但其他 30% 的场景不依赖于用户 id。这就像获取在这段时间之间进行过更改的所有用户。目前我们将时间戳存储为列并使用 Columnvaluefilter 来获取结果。有没有更好的方法来做到这一点。
提前致谢。
问候, 阿鲁尔。
【问题讨论】:
标签: hbase
我们有以行键作为用户 ID + 时间戳的 hasbe 表。我们大约 70% 的用例使用用户 ID 作为扫描的一部分。但其他 30% 的场景不依赖于用户 id。这就像获取在这段时间之间进行过更改的所有用户。目前我们将时间戳存储为列并使用 Columnvaluefilter 来获取结果。有没有更好的方法来做到这一点。
提前致谢。
问候, 阿鲁尔。
【问题讨论】:
标签: hbase
您可以尝试将开始和停止时间戳添加到 Scan,如果您自己将时间戳写入表,而不是默认的 hbase 时间戳。
如果您知道确切的日期或要搜索的日期+小时,并且此日期范围相对较小,我建议您使用另一个过滤器。 FuzzyRowFilter,可以使用,但不幸的是它没有范围模式,所以当我用它来搜索日期时,由于我的行键中有 yyyyMMddHH 模式,我可以在范围内每小时添加一个模糊过滤器来扫描对象,但这不适合您最终使用 10 个过滤器。但是如果你有时间你可以试试,因为现在使用列值过滤意味着对每个查询进行全表扫描。
您可以阅读此任务以了解支持模糊行过滤器的范围。 https://issues.apache.org/jira/browse/HBASE-6618 已开放多年,确实有补丁。
【讨论】:
在我的场景中,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);
【讨论】: