Spark:如何编写org.apache.spark.rdd.RDD [java.io.ByteArrayOutputStream]

时间:2016-12-28 12:19:33

标签: scala apache-spark rdd

我有一个带签名的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)

2 个答案:

答案 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