scala解码的snappy压缩字节数组有尾随的零

68de4m5k  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(522)

我正在尝试从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

rsl1atfo

rsl1atfo1#

这个问题源于 BytesWritable.getBytes ,它返回的备份数组可能比您的数据长。相反,打电话 copyBytes (如在spark中写入和读取原始字节数组-使用序列文件sequencefile)。
参见hadoop-6298:byteswriteable#getbytes是一个坏名字,它会导致编程错误,以了解更多细节。

相关问题