【问题标题】:How to write contents of RDD onto S3?如何将RDD的内容写入S3?
【发布时间】:2018-09-10 03:13:28
【问题描述】:

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

  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。

【问题讨论】:

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


    【解决方案1】:

    要在 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

    【讨论】:

    • 我试过了,但没用我得到文件未找到错误,谢谢
    【解决方案2】:

    您可以考虑使用 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""))
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2017-09-13
      • 2020-09-29
      • 2014-06-04
      • 1970-01-01
      相关资源
      最近更新 更多