2016-02-05 36 views
2

我有我的HBase数据,行密钥为siteid_timestamp。根据部分行密钥过滤HBase中的行

ROW COLUMN + CELL
001_1454578003995柱= HD:ABC,时间戳= 1454578173766,值= 2

001_1454578003996柱= HD:DEF,时间戳= 1454578173766,值= 2

002_1454578003997柱= HD :IJK,时间戳= 1454578173766,值= 2

002_1454578003998柱= HD:LMN,时间戳= 1454578173766,值= 2

的SITEID可以是不同的。 我的要求是获取时间戳范围内的行。此时间戳将是没有siteid和下划线的行键。我不想使用hbase时间戳。

所以,如果我问一个时间戳范围为> = 1454578003995 & & < = 1454578003996,我应该得到第一个两行。

你能帮我解决吗?

回答

3

对于这种情况,我们需要执行scanFilter(s) [1]。

由于我们必须根据rowkey进行过滤,因此我们可以将RowFilterRegexStringComparator一起使用。 RegexStringComparator允许我们使用方便的正则表达式查询/限制,但请记住,性能可能会受到大量数据的影响。为了说明

... 
    Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, 
    new RegexStringComparator("\\d+_12345*")); 
    scan.setFilter(filter); 
    ... 

一些伪代码,我们可以将多个filters为好。(见FilterList

查找到FuzzyRowFilter [3],如果您需要更多的效益。 (它对rowkey的格式/结构有一些限制)

一些具体的例子[4]。

希望它有帮助。

[1] HBASE扫描API:https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Scan.html

[2]过滤器和比较器:https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/package-summary.html

[3] https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/FuzzyRowFilter.html

[4] https://github.com/larsgeorge/hbase-book/blob/master/ch04/src/main/java/filters/RowFilterExample.java

+0

感谢您的回答。正如我们所看到的,RegexStringcomparator只能用于相同的操作,但我的要求是具有大于和小于操作的一系列值。我知道二进制比较可以做到这一点,但我不能给正则表达式比较只有时间戳和忽略siteid。任何解决方案在这里? 非常感谢您的帮助。 –

+0

你可以用正则表达式来做范围,但是很麻烦。我认为'FuzzyRowFilter'还不支持范围。我们可以通过几种方式解决这个问题*过滤器的组合。我们可以在'FilterList'的帮助下添加多个过滤器。 *然后我们可以选择创建自己的“比较器”或“过滤器”。 (https://开头github上。COM/larsgeorge/HBase的书/ BLOB /主/ CH04/src目录/主/ JAVA /过滤器/ CustomFilterExample.java) – Shyam

相关问题