【问题标题】:Decoded Snappy compressed byte arrays have trailing zeros解码后的 Snappy 压缩字节数组有尾随零
【发布时间】:2016-03-18 06:24:35
【问题描述】:

我正在尝试写入和读取从 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

【问题讨论】:

    标签: scala hadoop apache-spark protocol-buffers snappy


    【解决方案1】:

    这个问题源于BytesWritable.getBytes,它返回的后备数组可能比您的数据长。相反,请致电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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多