我正在使用Spark sql数据帧以镶木地板的形式写入s3
Dataset.write
.mode(SaveMode.Overwrite)
.parquet("s3://filepath")
在spark配置中,我为SSE和ACL指定了以下选项
spark.sparkContext.hadoopConfiguration.set("fs.s3a.server-side-encryption-algorithm", "AES256")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.acl.default","BucketOwnerFullControl")
如何将用户定义元数据添加到s3对象。
谢谢 萨拉瓦南。
答案 0 :(得分:0)
我认为今天没有可能。您无法通过EMR添加/更新S3对象的用户定义元数据。据我所知。同样,AWS Support是获得此答案的最佳来源,但我不相信API公开允许用户从EMR添加/更新用户定义的元数据
答案 1 :(得分:0)
这是一个很好的问题。不幸的是,Spark不允许这样做,因为Spark与文件系统无关(它在本地,HDFS或S3之间没有区别)。
在我看来,由于所有文件系统都支持某种元数据,因此Spark也应该提出一些建议...
但是,作为一种解决方法,您始终可以在文件上传后更改元数据。
使用Java的示例,将文件设为公开:
等级:
[group: 'org.apache.hadoop', name: 'hadoop-aws', version: '2.8.0'],
(provides: [group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.10.60'],
[group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.10.60'])
// Write data to S3
df
.write()
.save("s3a://BUCKET/test_json");
// (this generate test_json/_SUCCESS + test_json/part-XXX keys)
// Create S3 client
private final AmazonS3 conn;
AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
this.conn = new AmazonS3Client(credentials, clientConfig);
this.conn.setEndpoint(S3_ENDPOINT);
this.conn.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
// Get Spark generated folder files
this.conn.listObjects(BUCKET, "test_json").getObjectSummaries().forEach(obj -> {
this.conn.setObjectAcl(BUCKET, obj.getKey(), CannedAccessControlList.PublicRead);
});