一个字符编码引发的血案

有个工具类逐行读文本文件,读取数据然后放入内存中。代码如下:

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?如何查看集群的当前默认编码呢?

 

转载于:https://www.cnblogs.com/aprilrain/archive/2013/05/03/3057232.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值