scala - 解码的Snappy压缩字节数组的结尾为零

标签 scala hadoop apache-spark protocol-buffers snappy

我正在尝试读写从Hadoop序列文件中的protobuf创建的Snappy压缩字节数组。

从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

最佳答案

此问题源于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

关于scala - 解码的Snappy压缩字节数组的结尾为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072619/

相关文章:

java - 如何使 spring @ManagedOperationParameter 与 scala 一起工作

arrays - 求数组中除0之外的最小值

python - 如何为 Python 中的对象添加 "attach"功能,例如到 Pandas 数据框?

hadoop - 从包含 hadoop 中许多文件的目录中读取特定文件

apache-spark - 如何均匀分布数据集以避免倾斜连接(和长时间运行的任务)?

apache-spark - 如何访问Spark DataFrame中VectorUDT列的元素?

java - 在平等规则之间切换

hadoop - 如何在 Tez 上为 Pig 设置队列名称?

Hadoop Cygwin Windows 7 JAVA_HOME 路径未找到且命令未找到

hadoop - 海量数据导出noSQL选型建议