Я записал некоторые данные двоичного изображения в Had oop SequenceFile и хотел бы записать его как PNG вне Had oop, если возможно, используя Java.
[Отредактировано ] Обзор потока данных: Входные файлы → Генерация BufferedImages из ввода → Преобразование BufferedImages в двоичные массивы → Сохранение как SequenceFile в HDFS → Попытка взять SequenceFile за пределы HDFS и преобразовать его в PNG.
Однако я Я не уверен, как определить, где данные начинаются в SequenceFile. Из того, что я видел в документации SequenceFile , я могу использовать маркер syn c, чтобы найти конец заголовка SequenceFile, а затем использовать информацию о длине записи и длине ключа, чтобы найти начало value.
Однако я не уверен, как найти маркер syn c. Как мне найти, где заканчиваются метаданные заголовка и где начинается и заканчивается маркер syn c? Могу ли я рассчитать значение маркера syn c и найти его таким образом? Кроме того, как я могу узнать количество байтов, которое занимает длина записи и длина ключа?
Если есть альтернативные способы найти значение SequenceFile, дайте мне знать. Если это помогает, вот небольшой фрагмент кода, который я использовал для записи в SequenceFile.
baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos); //img is a BufferedImage
byte[] imBytes = baos.toByteArray();
baos.write(imBytes);
writer = SequenceFile.createWriter(conf, writer.file(new Path(imgPath)), writer.keyClass(Text.class),writer.valueClass(BytesWritable.class));
writer.append(new Text(imgPath), new BytesWritable(imBytes));
По сути, я взял BufferedImage, сгенерированный программой, записал его в массив байтов как PNG, затем записал его в SequenceFile.
[Edit] Я просмотрел исходный код SequenceFile , и там есть функция getSync()
? Я думаю, что это личное, поэтому не знаю, как бы я его использовал.