一个字符编码引发的血案
2013-05-03 18:59
162 查看
有个工具类逐行读文本文件,读取数据然后放入内存中。代码如下:
代码设计是既可单机执行,又可在hadoop集群中运行,可是天不遂人愿。。。
在linux单机运行时一切正常,当用于mapreduce中时总是缺少一些数据,具体查看时发现总行数比单机版的少。再测试发现在集群中时有的两行被认为是一行,这种情况全出现在前一行行尾有中文字符时,于是怀疑是编码问题。改一行代码之后断行正常并且运行正确:
即:显示设置reader的编码。
虽然问题解决了,但还是很困惑。此文件在linux本地文件系统中是utf8的编码,用hadoop fs -put到集群中。put过程中会改变文件的编码还是集群的默认编码不是utf8?如何查看集群的当前默认编码呢?
FSDataInputStream in = null; BufferedReader br = null; FileSystem fs = FileSystem.get(new URI(somePath), new Configuration()); in = fs.open(new Path(somePath)); br = new BufferedReader(new InputStreamReader(in)); while ((line = br.readLine()) != null) { counter++; dosomeoperation(); }
代码设计是既可单机执行,又可在hadoop集群中运行,可是天不遂人愿。。。
在linux单机运行时一切正常,当用于mapreduce中时总是缺少一些数据,具体查看时发现总行数比单机版的少。再测试发现在集群中时有的两行被认为是一行,这种情况全出现在前一行行尾有中文字符时,于是怀疑是编码问题。改一行代码之后断行正常并且运行正确:
br = new BufferedReader(new InputStreamReader(in, Charset.forName("utf8")));
即:显示设置reader的编码。
虽然问题解决了,但还是很困惑。此文件在linux本地文件系统中是utf8的编码,用hadoop fs -put到集群中。put过程中会改变文件的编码还是集群的默认编码不是utf8?如何查看集群的当前默认编码呢?
相关文章推荐
- mysql中一个普通ERROR 1135 (HY000)错误引发的血案
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
- hello world, 想说爱你不容易 —— 一个空格引发的血案
- 一个时区问题引发的血案
- 一个Sqrt函数引发的血案
- 一个视图引发的血案
- 一个由正则表达式引发的血案
- 一个冒号引发的血案
- 一个多线程问题引发的血案-(代码段执行完毕,子进程未执行完毕导致段错误)
- 一个分号引发的“血案”
- 记一个逗号引发的血案,Mark 安卓下的 Web 调试
- 一个Sqrt函数引发的血案
- 一个Sqrt函数引发的血案
- 一个“Spring轮子”引发的“血案”(2)
- 一个笑话,在群里引发的“血案”(血案=‘讨论’) 推荐
- 一个脚本引发的血案
- 一个“Sprng轮子”引发的“血案”(3)
- 【杂症】一个豌豆荚引发的血案——关于ADB server didn't ACK的问题
- 一个“Spring轮子”引发的“血案”(4)
- 一个“Spring轮子”引发的“血案”(6)