分享

hadoop读出文件是乱码,该如何解决

我写了一个程序<Text,Text> 这样的记录写入了sequencefile 。 接着我再另外一个程序中,去读取这个sequencefile中的每一条记录 ;发现读出来的内容是乱码 ?  谁帮我解决下啊
1.png

已有(2)人评论

跳转到指定楼层
hyj 发表于 2014-4-13 15:41:42
本帖最后由 hyj 于 2014-4-13 15:54 编辑

读入和读出都设置一下编码格式:

  1. out.writeInt(name.getBytes("utf8").length);
复制代码

-------------------------------------------------------------------------------
具体参考如下:
注意编码,写出String的时候不要让Java插手。

简单流程:

Map: readFields(ResultSet result)——从Mysql中读出;
Map:write(DataOutput out)——输出Map结果;
Reduce: readFields(DataInput in)——读回Map输出的中间结果;
从Log中看到Map从Mysql读出的字符串内容是正确的,但Reduce读回来就是乱码了。原来的代码如下

  1. public void readFields(DataInput in) throws IOException
  2.                 {
  3.                         super.readFields(in);
  4.                         this.id = in.readLong();
  5.                         int l1 = in.readInt();
  6.                         byte b1[] = new byte[l1];
  7.                         in.readFully(b1);
  8.                         name = new String(b1);
  9.                 }
  10.                 public void write(DataOutput out) throws IOException
  11.                 {
  12.                         super.write(out);
  13.                         out.writeLong(this.id);
  14.                         out.writeInt(name.length());
  15.                         out.writeBytes(name);
  16.                 }
复制代码

改成这样就正确了:
  1. public void write(DataOutput out) throws IOException
  2.                 {
  3.                         super.write(out);
  4.                         out.writeLong(this.id);
  5.                         out.writeInt(name.getBytes("utf8").length);
  6.                         out.write(name.getBytes("utf8"));
  7.                 }
复制代码




查了一下Java的帮助,原因是write(byte[])直接把每个Byte写出,而writeBytes(String)是以字符串中的字符为单位来写出的,所以被动了手脚。



write(byte[]):

Writes to the output stream all the bytes in array b. If b is null, a NullPointerException is thrown. If b.length is zero, then no bytes are written. Otherwise, the byte b[0] is written first, then b[1], and so on; the last byte written is b[b.length-1].


writeBytes(String s) :

Writes a string to the output stream. For every character in the string s, taken in order, one byte is written to the output stream. If s isnull, a NullPointerException is thrown.

亦可参考:hadoop MapReduce主程序中文乱码解决

回复

使用道具 举报

cgxss0314 发表于 2014-6-19 13:27:30
感谢分享,好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条