如何将RDD的内容写入S3?

时间:2018-03-31 07:15:10

标签: scala amazon-web-services apache-spark amazon-s3 amazon-emr

我有一个包含顶点id的RDD,它的x,y坐标,我想将其内容写入文本文件,在我的本地机器上我正在使用函数

  def printVertices(iterable: Iterable[Vertex], filename: String): Unit = {
    val pw = new PrintWriter(new File(filename))
    for (point <- iterable) {
      pw.write(point.id + ", " + point.coordinate.x + ", " + point.coordinate.y + "\n")
    }
    pw.close()
  }

printVertices(dt.points.collect, s"$output/points$id.txt")

在上面的代码中,dt.points是一个RDD,我想将它保存到文本文件中,如果我执行RDD.saveAsTextFile它会写入整个RDD,所以我想使用我的方法并写入s3。

2 个答案:

答案 0 :(得分:0)

要在S3上编写RDD(作为文本文件),只需将s3a添加到URI即可。像这样:

printVertices(dt.points.collect, s"s3a://$bucketName/$output/points$id.txt")

此外,如果您使用Spark 2.2 +

,则必须包含以下JAR
  • hadoop-aws-2.7.3.jar
  • aws-java-sdk-1.7.4.jar

答案 1 :(得分:0)

您可以考虑使用seratch / AWScala库以及使用它的方式(通过他们的文档)

import awscala._, s3._
implicit val s3 = S3.at(Region.Tokyo)

val buckets: Seq[Bucket] = s3.buckets
val bucket: Bucket = s3.createBucket("unique-name-xxx")
val summaries: Seq[S3ObjectSummary] = bucket.objectSummaries

bucket.put("sample.txt", new java.io.File("sample.txt"))

所以在你的情况下,你需要先获得桶

val bucket: Bucket = s3.bucket("your bucket unique name").get

并将文件放入存储桶

bucket.put(s"$output/points$id.txt", new java.io.File("s"$output/points$id.txt""))