HBase中正則過濾表示式與JAVA正則表示式不一致問題的分析和解決
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這樣的字元的設定加了一個方括號,加上,果然順利通過。