HBase提供了丰富的查询过滤功能。
比如说它提供了RegexStringComparator这样的函数,可以实现按照正则表达式进行过滤。它可以有效地弥补向前缀查询这样的机制,从而可以使hbase也支持了类似于like查询之类的功能。
然而在实践过程中,很多人都会遇到一个问题,对于里面的正则表达式没有过于详细的介绍,一直以为是直接从JAVA等一些标准的正则表达式演化过来。直接拿过来用就可以。
但是,这只是美好的猜测而已。
如stackoverflow上的这篇问题一样。http://stackoverflow.com/questions/13997794/java-regular-expression-for-hbase-scan-filter-not-working。
如现在想对一串数字字符进行查询,如201609282222633_1333222222_22222,
如果直接照用JAVA的正则表达式如“^20160928 \d{6}_133\d{4,}_\d{0,}$",这样在JAVA中肯定可以快速编译通过,然而在hbase查询中却通不过。
经过一番认真查看,才发现HBASE中的正则表达式略微有些区别。
最重要还是其源码中自带的一个小例子。如
* ValueFilter vf = new ValueFilter(CompareOp.EQUAL, | |
---|---|
* new RegexStringComparator( | |
* // v4 IP address | |
* "(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3,3}" | |
* "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(\/[0-9] )?" | |
* "|" | |
* // v6 IP address | |
* "((([\dA-Fa-f]{1,4}:){7}[\dA-Fa-f]{1,4})(:([\d]{1,3}.)" | |
* "{3}[\d]{1,3})?)(\/[0-9] )?")); | |
* </pre> | |
*/ |
这个类的源码中对于IP地址的查询中,发现其\d这样的字符的设置加了一个方括号,加上,果然顺利通过。