hadoop Text编码问题

Hadoop写map/reduce作业开始,就遇到了输入数据是GBK编码的问题,hadoop的writable默认是以utf-8进行编码,如果输入数据时GBK编码的话,则进行转码操作如:
String line=new String(value.getBytes(),0,value.getLength(),"GBK");
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。即
1

String line=new String(value.getBytes(),0,value.getLength(),"GBK");

Text的UTF-8特性也可以从TextOutputFormat中看出一二,在TextOutputFormat的源码中,
1

private static final String utf8 = “UTF-8″;//这里被写死成了utf-8

所以如果需要map/reduce输出其它编码格式的数据,需要自己实现OutputFormat,在其中指定编码方式,而不能使用默认的TextOutputFormat。具体的范例可以见淘宝数据平台与产品部官方博客上的博文 http://www.tbdata.org/archives/244 。
博文引用了http://blog.linezing.com/2011/04/hadoop%E7%9A%84mapreduce%E4%BD%9C%E4%B8%9A%E8%BE%93%E5%85%A5%E9%9D%9Eutf-8%E7%BC%96%E7%A0%81%E6%95%B0%E6%8D%AE%E7%9A%84%E5%A4%84%E7%90%86%E5%8E%9F%E7%90%86
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值