如何将转换后的数据从分区发送到S3?

时间:2015-11-14 01:09:26

标签: apache-spark

我有一个RDD,大到collect。我已经向RDD应用了一系列转换,并希望将其转换后的数据直接从我的从属分区发送到S3。我目前的运作情况如下:

val rdd:RDD = initializeRDD
val rdd2 = rdd.transform
rdd2.first // in order to force calculation of RDD
rdd2.foreachPartition sendDataToS3

不幸的是,发送到S3的数据未转换。 RDD看起来与第initializeRDD阶段完全一样。

这是sendDataToS3的主体:

implicit class WriteableRDD[T](rdd:RDD[T]){

def transform:RDD[String] = rdd map {_.toString}

....
def sendPartitionsToS3(prefix:String) = {
  rdd.foreachPartition { p =>
    val filename = prefix+new scala.util.Random().nextInt(1000000)
    val pw = new PrintWriter(new File(filename))
    p foreach pw.println
    pw.close
    s3.putObject(S3_BUCKET, filename, new File(filename))
  }
  this
}

}

使用rdd.transform.sendPartitionsToS3(prefix)调用此方法。

如何确保sendDataToS3中发送的数据是转换后的数据?

1 个答案:

答案 0 :(得分:3)

我的猜测是您的代码中存在一个未包含在问题中的错误。

我正在回答只是为了确保你知道RDD.saveAsTextFile。您可以在S3(s3n://bucket/directory)上给它一个路径,它会直接从执行程序将每个分区写入该路径。

我很难想象你何时需要实现自己的sendPartitionsToS3而不是saveAsTextFile