hadoop編碼問題,mapreduce中Tex與string的轉化 亂碼問題


引用:http://blog.csdn.net/zklth/article/details/11829563

Hadoop處理GBK文本時,發現輸出出現了亂碼,原來HADOOP在涉及編碼時都是寫死的UTF-8,如果文件編碼格式是其它類型(如GBK),則會出現亂碼。

此時只需在mapper或reducer程序中讀取Text時,使用transformTextToUTF8(text, "GBK");進行一下轉碼,以確保都是以UTF-8的編碼方式在運行。

public static Text transformTextToUTF8(Text text, String encoding) {
String value = null;
try {
value = new String(text.getBytes(), 0, text.getLength(), encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace(); }
return new Text(value);
}
 

這里核心代碼是: String line=new String(text.getBytes(),0,text.getLength(),"GBK"); //這里的value是Text類型

若直接使用 String line=value.toString(); 會輸出亂碼, 這是由Text這個Writable類型造成的。初學時,一直認為和LongWritable對long的封裝一樣,Text類型是String的Writable封裝。但其實Text和String還是有些區別,它是一種UTF-8格式的Writable,而Java中的String是Unicode字符。所以直接使用value.toString()方法,會默認其中的字符都是UTF-8編碼過的,因而原本GBK編碼的數據使用Text讀入后直接使用該方法就會變成亂碼。

 

正確的方法是將輸入的Text類型的value轉換為字節數組(value.getBytes()),使用String的構造器String(byte[] bytes, int offset, int length, Charset charset),通過使用指定的charset解碼指定的byte子數組,構造一個新的String。

如果需要map/reduce輸出其它編碼格式的數據,需要自己實現OutputFormat,在其中指定編碼方式,而不能使用默認的TextOutputFormat。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM