已解码的 Snappy 压缩字节数组具有尾随零
Decoded Snappy compressed byte arrays have trailing zeros
我正在尝试写入和读取从 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
此问题源于 BytesWritable.getBytes
,其中 returns 一个可能比您的数据更长的后备数组。相反,请调用 copyBytes
(如 Write and read raw byte arrays in Spark - using Sequence File SequenceFile)。
有关详细信息,请参阅 HADOOP-6298: BytesWritable#getBytes is a bad name that leads to programming mistakes。
我正在尝试写入和读取从 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
此问题源于 BytesWritable.getBytes
,其中 returns 一个可能比您的数据更长的后备数组。相反,请调用 copyBytes
(如 Write and read raw byte arrays in Spark - using Sequence File SequenceFile)。
有关详细信息,请参阅 HADOOP-6298: BytesWritable#getBytes is a bad name that leads to programming mistakes。