我有一个Spark使用saveAsObjectFile函数生成的序列文件。文件内容只是一些int数字。我想用Java在本地阅读它。这是我的代码:
FileSystem fileSystem = null;
SequenceFile.Reader in = null;
try {
fileSystem = FileSystem.get(conf);
Path path = new Path("D:\\spark_sequence_file");
in = new SequenceFile.Reader(conf, SequenceFile.Reader.file(path));
Writable key = (Writable)
ReflectionUtils.newInstance(in.getKeyClass(), conf);
BytesWritable value = new BytesWritable();
while (in.next(key, value)) {
byte[] val_byte = value.getBytes();
int val = ByteBuffer.wrap(val_byte, 0, 4).getInt();
}
} catch (IOException e) {
e.printStackTrace();
}
但我无法正确阅读;我得到了所有相同的价值观,显然他们错了。这是我的答案快照
有人能帮助我吗?
答案 0 :(得分:0)
在Hadoop中,键通常是WritableComparable类型,值类型为Writable。记住这个基本概念我以下面的方式阅读序列文件。
Configuration config = new Configuration();
Path path = new Path(PATH_TO_YOUR_FILE);
SequenceFile.Reader reader = new SequenceFile.Reader(FileSystem.get(config), path, config);
WritableComparable key = (WritableComparable) reader.getKeyClass().newInstance();
Writable value = (Writable) reader.getValueClass().newInstance();
while (reader.next(key, value))
// do some thing
reader.close();
您的案例中的数据问题可能是因为您使用saveAsObjectFile()
而非使用saveAsSequenceFile(String path,scala.Option<Class<? extends org.apache.hadoop.io.compress.CompressionCodec>> codec)
请尝试使用上述方法,看看问题是否仍然存在。