[英]How to Scan HBase Rows efficiently
我需要编写一个MapReduce Job来获取给定Date Range中的所有行(比如说最后一个月)。 如果My Row Key以Date开头,那将是一场轻松的尝试。 但我频繁的Hbase查询是关键的起始值。
我的行键恰好是A | B | C | 20120121 | D. A / B / C与日期(以YearMonthDay格式)的组合形成唯一的行ID。
我的Hbase表可能有几百万行。 我的Mapper是否应该读取所有表格并过滤掉每一行,如果它落在给定的日期范围内,或者扫描/过滤器可以帮助处理这种情况?
有人可以建议(或代码片段)以有效的方式处理这种情况吗?
谢谢-Panks
带有RegEx过滤器的RowFilter可以工作,但不是最佳解决方案。 或者,您可以尝试使用二级索引。
另一个解决方案是尝试FuzzyRowFIlter 。 FuzzyRowFilter使用一种快进,因此在整个扫描过程中跳过许多行,因此比RowFilter Scan更快。 你可以在这里阅读更多相关信息。
或者,BloomFilters也可能会有所帮助,具体取决于您的架构。 如果您的数据很大,您应该对二级索引和布隆过滤器进行比较分析。
您可以将RowFilter与RegexStringComparator一起使用。 您需要提供适当过滤日期的RegEx。 此页面包含一个示例,其中包括为MapReduce扫描程序设置过滤器。
我刚刚开始使用HBase, bloom过滤器可能有所帮助。
您可以修改发送到Mapper的扫描以包含过滤器。 如果您的日期也是记录时间戳,则很容易:
Scan scan = new Scan();
scan.setTimeRange(minTime, maxTime);
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class,
OutputKey.class, OutputValue.class, job);
如果行键中的日期不同,则必须在扫描中添加过滤器。 此过滤器可以对列或行键进行操作。 我认为只有行键才会变得混乱。 如果将日期放在列中,则可以创建一个FilterList
,其中所有条件都必须为true,并使用CompareOp.GREATER
和CompareOp.LESS
。 然后使用scan.setFilter(filterList)
将过滤器添加到扫描中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.