我正在读一本书 SequenceFile
在我的mapreduce程序中,输入格式为 Mapper
作为 SequenceFileAsBinaryInputFormat
. 序列文件具有 IntWritable
作为关键和 ArrayWritable
作为价值。
job.setInputFormatClass(SequenceFileAsBinaryInputFormat.class);
Map程序将字节作为键和值写入。
public void map(BytesWritable key, BytesWritable value, Context context)
现在我想把钥匙换回去 IntWritable
但我得到了一个 NumberFormatException
. 看来我做错了什么。
new IntWritable(Integer.parseInt(new String(key.getBytes())));
1条答案
按热度按时间uyto3xhc1#
BytesWriteable类公开了数据的原始二进制表示(不管它是什么类型)。如果您存储的是数字,那么原始二进制表示由数字的序列化类决定。几乎可以肯定,它不会像parseint所期望的“123”那样看起来很好。更可能是一些字节块,比如1a34e56c。。。取决于输出序列化格式。
如果您的数据实际上是文本,您最好只使用textinputformat。另一方面,如果您知道文件的数据类型是什么,那么使用sequencefile更好。sequencefileasbinaryinputformat适用于需要访问磁盘上数据的原始表示形式的情况(例如,缺少反序列化数据的类,需要自己提供一个)。