将数据集元素保存到具有指定文件路径的文件中

时间:2019-06-28 10:51:21

标签: scala apache-spark amazon-s3

我有一个事件案例类的数据集,我想将其中的json字符串元素保存到s3上的文件中,该文件的路径为bucketName / service / yyyy / mm / dd / hh / [SomeGuid] .gz < / p>

例如,事件案例类如下所示:

case class Event(
  hourPath: String,  // e.g. bucketName/service/yyyy/mm/dd/hh/ 
  json: String  // The json line that represents this particular event.
  ... // Other properties used in earlier transformations.
)

是否有一种方法可以保存我们将属于特定时间的事件写入s3的文件的数据集?

在DataframeWriter上调用partitionBy是我能获得的最接近的方法,但是文件路径并不是我想要的。

1 个答案:

答案 0 :(得分:1)

您可以迭代每个项目并将其写入S3中的文件中。使用Spark可以高效执行此操作,因为它将并行执行。

此代码对我有用:

val tempDS = eventsDS.rdd.collect.map(x => saveJSONtoS3(x.hourPath,x.json))

def saveJSONtoS3(path: String, jsonString: String) : Unit = {
    val bucketName = path.substring(0,path.indexOf('/'));
    val file = path.substring(bucketName.length()+1);

    val creds = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY)
    val amazonS3Client = new AmazonS3Client(creds)
    val meta = new ObjectMetadata();
    amazonS3Client.putObject(bucketName, file, new ByteArrayInputStream(jsonString.getBytes), meta)
 }

您需要导入:

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.auth.BasicAWSCredentials
import com.amazonaws.services.s3.model.ObjectMetadata

您需要包含aws-java-sdk库。