Hadoop的map/reduce作业输入非UTF-8编码数据的处理原理
从刚毕业开始接触Hadoop写map/reduce作业开始,就遇到了输入数据是GBK编码的问题,找了身边的牛人搞到了一句代码解决。
String line=new String(value.getBytes(),0,value.getLength(),”GBK”); //这里的value是Text类型。
然后一直在用,却也没有想过其中的原由。最近埋下头来学习Hadoop的基础知识,又联想到了这里。
其实,String line=value.toString();之所以会把GBK编码的输入变成乱码,很关键的一个因素是Text这个Writable类型造成的。初学时,一直认为和LongWritable对long的封装一样,Text类型是String的Writable封装。但其实Text和String还是有些区别,它是一种UTF-8格式的Writable,而Java中的String是Unicode字符。所以直接使用value.toString()方法,会默认其中的字符都是UTF-8编码过的,因而原本GBK编码的数据使用Text读入后直接使用该方法就会变成乱码。
正确的方法是将输入的Text类型的value转换为字节数组,使用String的构造器String(byte[] bytes, int offset, int length, Charset charset),通过使用指定的charset解码指定的byte子数组,构造一个新的String。即 String line=new String(value.getBytes(),0,value.getLength(),”GBK”);
Text的UTF-8特性也可以从TextOutputFormat中看出一二,在TextOutputFormat的源码中,
private static final String utf8 = “UTF-8″;//这里被写死成了utf-8
所以如果需要map/reduce输出其它编码格式的数据,需要自己实现OutputFormat,在其中指定编码方式,而不能使用默认的TextOutputFormat。具体的范例可以见淘宝数据平台与产品部官方博客上的博文 http://www.tbdata.org/archives/244 。
建议继续学习:
- Facebook的实时Hadoop系统 (阅读:11267)
- 字符编码和中文乱码小叙 (阅读:6788)
- 中文编码杂谈 (阅读:6014)
- hadoop rpc机制 && 将avro引入hadoop rpc机制初探 (阅读:5939)
- PHP编码规范 (阅读:5350)
- Linux screen窗口中文乱码问题 (阅读:5069)
- UTF-8编码中BOM的检测与删除 (阅读:4947)
- base64_encode 和 urlencode (阅读:4941)
- Unicode与字符汉字相互转换 (阅读:4949)
- 百度是如何使用hadoop的 (阅读:4853)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:武文智 来源: 量子数科院
- 标签: Hadoop map reduce 编码
- 发布时间:2011-06-02 13:33:32
-
[1178] WordPress插件开发 -- 在插件使用 -
[74] 解决 nginx 反向代理网页首尾出现神秘字 -
[43] web开发设计人员不可不用的在线web工具和 -
[41] Java开发岗位面试题归类汇总 -
[32] Rax 系列教程(长列表) -
[31] 一句话crontab实现防ssh暴力破解 -
[31] 手机产品设计方向 -
[28] 如何建立合适的索引? -
[27] 程序员疫苗:代码注入 -
[26] oracle技术方面的路线
