Декодированные сжатые байтовые массивы 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 - это плохое имя, которое приводит к ошибкам программирования для получения более подробной информации.