Hadoop默認使用的是UTF-8編碼方式。在Hadoop使用過程中,需要將其他的編碼方式進行轉碼以防止亂碼的出現。
在Hadoop中出現亂碼的情景是TextFileInputFormat,即處理Text的情景。在這種情況下,Value一般是Text。爲了實現轉碼我們看一下Text的實現。在Text中包含了源數據的byte數組以及其中數據的長度,這是原始數據,不經過編碼的。在Text類中包含了CharsetEncoder和CharsetDecoder兩個變量,這兩個變量都是UTF-8編碼。當把byte數據寫到文件時(writeString方法)需要對其進行Encode,將其編碼成UTF-8格式。當Text讀入數據時(readString方法),用Decoder將其從UTF-8模式轉碼成Unicode。
在Map執行過程中,Text的byte數組是原始數據的byte數組,可以直接將該數組進行轉碼,具體實現如下:
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
byte[] valueBytes = value.getBytes();
String result = new String(valueBytes, "GB2312");
context.write(key, new Text(result));
}