IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Hadoop的map/reduce作业输入非UTF-8编码数据的处理原理

量子数科院 2011-06-02 13:33:32 累计浏览 5,644 次
本机暂存

     从刚毕业开始接触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

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. HFile存储格式 (累计阅读 15,973)
  2. Zookeeper工作原理 (累计阅读 12,199)
  3. Facebook的实时Hadoop系统 (累计阅读 11,491)
  4. HBase技术介绍 (累计阅读 8,074)
  5. 字符编码和中文乱码小叙 (累计阅读 7,119)
  6. 比较完美地解决了 vim 编辑中文的问题 (累计阅读 6,820)
  7. 获取指定(访客)IP的所有信息,地址、邮政编码、国家、经纬度等的API (累计阅读 6,458)
  8. 中文编码杂谈 (累计阅读 6,371)
  9. hadoop rpc机制 && 将avro引入hadoop rpc机制初探 (累计阅读 6,217)
  10. HIVE中UDTF编写和使用 (累计阅读 5,998)