我正在尝试从hadoop序列文件的protobuf创建snappy压缩字节数组。
从hadoop读回的数组有尾随的零。如果字节数组是一个小而简单的数组,那么去掉尾随的零就足以解析protobuf了,但是对于更复杂的对象和大序列文件,解析失败。
字节数组示例:
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条答案
按热度按时间rsl1atfo1#
这个问题源于
BytesWritable.getBytes
,它返回的备份数组可能比您的数据长。相反,打电话copyBytes
(如在spark中写入和读取原始字节数组-使用序列文件sequencefile)。参见hadoop-6298:byteswriteable#getbytes是一个坏名字,它会导致编程错误,以了解更多细节。