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);}
输出文件为GBK,则重写TextOutputFormat类,public class GBKFileOutputFormat<K, V> extends FileOutputFormat<K, V>,把TextOutputFormat的源码拷过来,然后把里面写死的utf-8编码改成GBK编码。最后,在run程序中,设置job.setOutputFormatClass(GBKFileOutputFormat.class);
无非就是编码不统一,一般情况下,这样就能转码了
String str="你好";System.out.println(str);System.out.println(new String(str.getBytes(),"utf-8"));
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
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);
}
输出文件为GBK,则重写TextOutputFormat类,public class GBKFileOutputFormat<K, V> extends FileOutputFormat<K, V>,把TextOutputFormat的源码拷过来,然后把里面写死的utf-8编码改成GBK编码。最后,在run程序中,设置job.setOutputFormatClass(GBKFileOutputFormat.class);
无非就是编码不统一,一般情况下,这样就能转码了
String str="你好";
System.out.println(str);
System.out.println(new String(str.getBytes(),"utf-8"));