HBase處理中文字符串

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);完成逆向轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章