我正在尝试在MapReduce程序中读取SequenceFile
,其输入格式为Mapper
。序列文件将SequenceFileAsBinaryInputFormat
作为键,并将IntWritable
作为值。
job.setInputFormatClass(SequenceFileAsBinaryInputFormat.class);
映射器获取BytesWritable作为键和值。
public void map(BytesWritable key, BytesWritable value, Context context)
现在,我试图将密钥转换回
ArrayWritable
,但是我得到了IntWritable
。看来我在做一些根本错误的事情。new IntWritable(Integer.parseInt(new String(key.getBytes())));
最佳答案
BytesWritable类公开数据的原始二进制表示形式(无论它是哪种类型)。如果要存储数字,则原始二进制表示形式由数字的序列化类确定。几乎肯定不会看起来像parseInt期望的“123”之类的漂亮文本。更有可能是一些字节块,例如1A34E56C ...等,具体取决于输出序列化格式。
如果您的数据实际上是文本,那么最好使用TextInputFormat。另一方面,如果您知道文件的数据类型是什么,那么最好使用SequenceFile。当您需要访问磁盘上数据的原始表示形式时(例如,如果您缺少用于反序列化数据的类,并且需要自己提供一个),SequenceFileAsBinaryInputFormat非常有用。
关于hadoop - 从SequenceFileAsBinaryInputFormat读取 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20841155/