如何使用Apache Spark将RDD[Array[Byte]]
写入文件并再次阅读?
答案 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)