Author:Pirate Leo
myBlog: http://blog.csdn.net/pirateleo/
myEmail: [email protected]
轉載請註明出處,謝謝。
文中可能涉及到的API:
Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/
HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html
Begin!
在設置scan的startRowKey與endRowKey時,經常需要在某個條件字符串後面補充出一個範圍。(再比如SingleColumnValueFilter也會用到)
比如:我的條件字符串是“abc”,scan時我需要將下述內容都囊括到我scan的範圍內。
abc123
abcdabc
abccca
....
這時候我startRowKey使用“abc”即可,上述字符串按字典序都比“abc”要大,“abc”串c之後的值是0嘛~
而endRowKey最初我使用了“abc~”,因爲我查ASCII碼錶時‘~’是倒數第二個,值爲127,足夠大,肯定大於上述串中的1、d、c等字符。
這樣做,在處理英文數據時就足夠了,系統運行正常。
但當我處理中文數據時,中文一般都是以UTF-8格式處理的,一個漢字表示出來類似“0xe6,0xc2,0xe1”。0xe6大於127。所以使用‘~’遇到中文必然悲催。
我的解決方法:
使用UltraEdit,進入十六進制編輯模式,將值改爲FF。然後回到文本模式,將剛纔的字符複製下來。這個字符應該是一個不可顯示的字符,看着好像兩個空格的長度。
然後在設置endRowKey時
new String(name + " "); //這裏只是示例,引號間就是剛纔複製的那個字符。將這個字符串作爲endRowKey,果然所有的中文字符就囊括在內了。
另外一定要注意:使用HBase API時不要使用str.getBytes將String轉化爲byte[] ,而應該使用Bytes.toBytes(str);同樣使用Bytes.toString(bytes);完成逆向轉換。