从SequenceFileAsBinaryInputFormat中读取键

时间:2013-12-30 14:05:43

标签: hadoop

我正在尝试在我的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())));

1 个答案:

答案 0 :(得分:1)

BytesWritable类公开数据的原始二进制表示(它碰巧是什么类型)。如果要存储数字,则原始二进制表示由数字的序列化类确定。它几乎肯定不会像“123”这样的好文本,这正是parseInt所期待的。根据输出序列化格式,更可能是像1A34E56C等一些字节块。

如果您的数据实际上是文本,那么仅使用TextInputFormat可能会更好。另一方面,如果您知道文件的数据类型是什么,那么只需更新SequenceFile。 SequenceFileAsBinaryInputFormat适用于需要访问磁盘上数据的原始表示的情况(例如,如果您缺少一个类来反序列化数据,并且需要自己提供一个)。