使用序列文件SequenceFile在Spark中写入和读取原始字节数组

时间:2014-06-06 13:42:56

标签: scala hadoop hdfs apache-spark sequencefile

如何使用Apache Spark将RDD[Array[Byte]]写入文件并再次阅读?

2 个答案:

答案 0 :(得分:11)

常见的问题似乎是变得奇怪,无法将异常从BytesWritable转换为NullWritable。其他常见的问题是BytesWritable getBytes是完全毫无意义的废话,根本不会得到字节。 getBytes做的是获取你的字节,而不是在最后添加大量的零!您必须使用copyBytes

val rdd: RDD[Array[Byte]] = ???

// To write
rdd.map(bytesArray => (NullWritable.get(), new BytesWritable(bytesArray)))
  .saveAsSequenceFile("/output/path", codecOpt)

// To read
val rdd: RDD[Array[Byte]] = sc.sequenceFile[NullWritable, BytesWritable]("/input/path")
  .map(_._2.copyBytes())

答案 1 :(得分:0)

以下是根据@Choix要求可以从spark-shell运行的所有必需导入的代码段

import org.apache.hadoop.io.BytesWritable
import org.apache.hadoop.io.NullWritable

val path = "/tmp/path"

val rdd = sc.parallelize(List("foo"))
val bytesRdd = rdd.map{str  =>  (NullWritable.get, new BytesWritable(str.getBytes) )  }
bytesRdd.saveAsSequenceFile(path)

val recovered = sc.sequenceFile[NullWritable, BytesWritable]("/tmp/path").map(_._2.copyBytes())
val recoveredAsString = recovered.map( new String(_) )
recoveredAsString.collect()
// result is:  Array[String] = Array(foo)