Как прочитать файл последовательности Hadoop с использованием Java
У меня есть файл последовательности, сгенерированный Spark с помощью функции saveAsObjectFile. Содержимое файла - это просто некоторые целые числа. И я хочу прочитать это локально с 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();
}
Но я не могу прочитать это правильно; Я просто получаю все одинаковые значения, и, очевидно, они ошибаются. Вот мой снимок ответа
Кто-нибудь может мне помочь?
1 ответ
В 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)
Пожалуйста, попробуйте использовать вышеупомянутый метод и посмотрите, если проблема не устранена.