Декодированные сжатые байтовые массивы Snappy имеют завершающие нули

Я пытаюсь писать и читать сжатый байтовый массив Snappy, созданный из protobuf из файла последовательности Hadoop.

Массив, считанный из hadoop, имеет конечные нули. Если байтовый массив представляет собой небольшой и простой удаляющий завершающие нули, то достаточно для синтаксического анализа протобуфа, однако для более сложных объектов и файлов с большой последовательностью парсинг завершается неудачно.

Пример байтового массива:

val data = Array(1,2,6,4,2,1).map(_.toByte)
val distData = sparkContext.parallelize(Array.fill(5)(data))
  .map(j => (NullWritable.get(), new BytesWritable(j)))

distData
  .saveAsSequenceFile(file, Some(classOf[SnappyCodec]))

val original = distData.map(kv=> kv._2.getBytes).collect()

val decoded = sparkContext
  .sequenceFile[NullWritable, BytesWritable](file)
  .map( kv => kv._2.getBytes.mkString).collect().foreach(println(_))

Вывод: оригинал:= 126421, декодирование:= 126421000

1 ответ

Решение

Эта проблема проистекает из BytesWritable.getBytes, который возвращает резервный массив, который может быть длиннее, чем ваши данные. Вместо этого позвоните copyBytes (как в " Запись и чтение необработанных байтовых массивов в Spark" - с использованием файла последовательности SequenceFile).

См. HADOOP-6298: BytesWritable#getBytes - это плохое имя, которое приводит к ошибкам программирования для получения более подробной информации.

Другие вопросы по тегам