我需要编写一个MapReduce作业,它获取给定日期范围中的所有行(比如说最后一个月)。如果My Row Key以Date开头,那将是一场轻松的尝试。但我频繁的Hbase查询是关键的起始值。
我的行密钥正好是 A | B | C | 20120121 | D 。 A / B / C与日期(以YearMonthDay格式)的组合形成唯一的行ID。
我的Hbase表可能有多达几百万行。我的Mapper是否应该读取所有表格并过滤掉每一行,如果它落在给定的日期范围内,或者扫描/过滤器可以帮助处理这种情况?
有人可以建议(或代码片段)以有效的方式处理这种情况吗?
由于 -Panks
答案 0 :(得分:10)
带有RegEx过滤器的RowFilter可以工作,但不是最佳解决方案。或者,您可以尝试使用二级索引
另一个解决方案是尝试FuzzyRowFIlter。 FuzzyRowFilter使用一种快进,因此在整个扫描过程中跳过许多行,因此比RowFilter Scan更快。您可以阅读更多相关信息here。
或者,BloomFilters也可能会有所帮助,具体取决于您的架构。如果您的数据很大,您应该对二级索引和布隆过滤器进行比较分析。
答案 1 :(得分:5)
您可以RowFilter使用RegexStringComparator。您需要提供适当过滤日期的RegEx。 This page有一个示例,其中包括为MapReduce扫描程序设置过滤器。
答案 2 :(得分:0)
我刚刚开始使用HBase,bloom filters可能有帮助。
答案 3 :(得分:0)
您可以修改发送到Mapper的扫描以包含过滤器。如果您的日期也是记录时间戳,那么很简单:
Scan scan = new Scan();
scan.setTimeRange(minTime, maxTime);
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class,
OutputKey.class, OutputValue.class, job);
如果行键中的日期不同,则必须在扫描中添加过滤器。此过滤器可以对列或行键进行操作。我认为只有行键才会变得混乱。如果您将日期放在列中,则可以设置FilterList
,其中所有条件都必须为真,并使用CompareOp.GREATER
和CompareOp.LESS
。然后使用scan.setFilter(filterList)
将过滤器添加到扫描中。