我有一个带签名的RDD
FullImageVC
在这个RDD中,每一行都有自己的分区。
此ByteArrayOutputStream是zip输出。我正在对每个分区中的数据应用一些处理,我想将每个分区的处理数据导出为单个zip文件。将最终RDD中的每一行导出为hdfs上每行一个文件的最佳方法是什么?
如果您有兴趣知道我最终如何使用这样的Rdd。
org.apache.spark.rdd.RDD[java.io.ByteArrayOutputStream]
编辑:计数完美无缺
val npyData = transformedTopData.select("tokenIDF", "topLevelId").rdd.repartition(2).mapPartitions(x => {
val vectors = for {
row <- x
} yield {
row.getAs[Vector](0)
}
Seq(ml2npyCSR(vectors.toSeq).zipOut)
}.iterator)
答案 0 :(得分:0)
Spark几乎不支持文件系统操作。您需要使用Hadoop FileSystem API来创建单个文件
// This method is needed as Hadoop conf object is not serializable
def createFileStream(pathStr:String) = {
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
val hadoopconf = new Configuration();
val fs = FileSystem.get(hadoopconf);
val outFileStream = fs.create(new Path(pathStr));
outFileStream
}
// Method writes to individual files.
// Needs a unique id along with object for output file naming
def writeToFile( x:(Char, Long) ) : Unit = {
val (dataStream, id) = x
val output_dir = "/tmp/del_a/"
val outFileStream = createFileStream(output_dir+id)
dataStream.writeTo(outFileStream)
outFileStream.close()
}
// zipWithIndex used for creating unique id for each item in rdd
npyData.zipWithIndex().foreach(writeToFile)
参考:
Hadoop FileSystem example
ByteArrayOutputStream.writeTo(java.io.OutputStream)
答案 1 :(得分:0)
我发现我应该将我的数据表示为PairRDD并实现自定义FileOutputFormat。我查看了SequenceFileOutputFormat的实现以获得灵感,并设法根据它编写我自己的版本。
我的自定义FileOutputFormat可用here