最近在处理一个log时,发现出现乱码,想起来自己要处理的log编码是GB18030,而hadoop默认的编码格式是UTF-8,所以需要转化。在读取数据的时候就是GBK转化为UTF-8,在处理完成后写入结果时,将UTF-8 转化为GBK(我这个log是GB18030)
map输入时,将GB18030转UTF-8
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
value = getTextToUTF8(value, "GB18030");// 转码 为UTF-8
而getTextToUTF8函数如下:
public Text getTextToUTF8(Text text, String encoding) {
String value = null; // Java String 是 Unicode 形式.
try {
value = new String(text.getBytes(), 0, text.getLength(), encoding); // text.getBytes()得到的byte数组是原始数据的byte数组,是原始编码.
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new Text(value);
}
Reduce输出时,将UTF-8转化为 GB18030
在网上找资料的时候,有些网友说在TextOutputFormat将utf-8写死了,如果在Reduce阶段,想将结果编码为GBK,需要重写 TextOutputFormat
但是发现,其实也不需要,直接转化也行的,方法如下
private LongWritable result = new LongWritable();
public void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException {
long sum = 0;
for (LongWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(new Text(key.toString().getBytes("GB18030")), result);
//context.write(key, result);
}
处理完毕,发现结果不是乱码,可见无需重写TextOutputFormat类也行。
参考文献
http://note.youdao.com/share/?id=04678102d70bae8334b26df2c9c4a961&type=note#/
网友评论