问题原因
hadoop 在编码时都是写死的utf-8,如果文件编码为GBK,就会出现乱码。
解决方法
在mapper或reducer读取文本的时候,将Text转换下编码即可。编码转换使用下面的transformTextToUtf8(Text text, String encoding)
。
将输入的Text类型的value转换为字节数组,使用String的构造器String(byte[] bytes, int offset, int length, Charset charset),通过使用指定的charset解码指定的byte子数组,构造一个新的String。
如果需要map/reduce输出其它编码格式的数据,需要自己实现OutputFormat,在其中指定编码方式,而不能使用默认的TextOutputFormat。
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);
}