我有一个事件案例类的数据集,我想将其中的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是我能获得的最接近的方法,但是文件路径并不是我想要的。
答案 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库。