我正在尝试在我的MapReduce程序中阅读SequenceFile
,并将Mapper
的输入格式设为SequenceFileAsBinaryInputFormat
。序列文件的密钥为IntWritable
,值为ArrayWritable
。
job.setInputFormatClass(SequenceFileAsBinaryInputFormat.class);
Mapper将BytesWritable作为键和值。
public void map(BytesWritable key, BytesWritable value, Context context)
现在我正在尝试将密钥转换回IntWritable
,但我得到的是NumberFormatException
。看起来我在做一些根本错误的事情。
new IntWritable(Integer.parseInt(new String(key.getBytes())));
答案 0 :(得分:1)
BytesWritable类公开数据的原始二进制表示(它碰巧是什么类型)。如果要存储数字,则原始二进制表示由数字的序列化类确定。它几乎肯定不会像“123”这样的好文本,这正是parseInt所期待的。根据输出序列化格式,更可能是像1A34E56C等一些字节块。
如果您的数据实际上是文本,那么仅使用TextInputFormat可能会更好。另一方面,如果您知道文件的数据类型是什么,那么只需更新SequenceFile。 SequenceFileAsBinaryInputFormat适用于需要访问磁盘上数据的原始表示的情况(例如,如果您缺少一个类来反序列化数据,并且需要自己提供一个)。