在Amazon S3存储桶中读写文件

5

我需要从Amazon S3 bucket中读取一个大于15MB的文件(比如说sample.csv)。然后我需要处理sample.csv中的数据,并将其写入S3 bucket中的另一个目录。 我计划使用AWS Lambda函数来运行我的Java代码。

作为第一步,我已经开发了Java代码在本地系统上运行。Java代码从S3 bucket中读取sample.csv文件,并使用put方法将数据写回到S3 bucket。但是我发现只有最后一行被处理并且被放回。

Region clientRegion = Region.Myregion;    
AwsBasicCredentials awsCreds = AwsBasicCredentials.create("myAccessId","mySecretKey");    
S3Client s3Client = S3Client.builder().region(clientRegion).credentialsProvider(StaticCredentialsProvider.create(awsCreds)).build();    
ResponseInputStream<GetObjectResponse> s3objectResponse = s3Client.getObject(GetObjectRequest.builder().bucket(bucketName).key("Input/sample.csv").build());    
BufferedReader reader = new BufferedReader(new InputStreamReader(s3objectResponse));    
String line = null;
while ((line = reader.readLine()) != null) {
                s3Client.putObject(PutObjectRequest.builder().bucket(bucketName).key("Test/Testout.csv").build(),RequestBody.fromString(line));
}

例子:sample.csv 包含

1,sam,21,java,beginner;
2,tom,28,python,practitioner;
3,john,35,c#,expert.

我的输出应该是:
1,mas,XX,java,beginner;
2,mot,XX,python,practitioner;
3,nhoj,XX,c#,expert. 

但只有3,nhoj,XX,c#,expert被写在Testout.csv文件中。

1个回答

5
putObject() 方法创建一个 Amazon S3 对象。
由于不可能对 S3 对象进行追加或修改,因此每次 while 循环执行时,都会创建一个新的 Amazon S3 对象。
相反,建议按照以下方式操作:
  • 下载 Amazon S3 中的源文件到本地磁盘(使用带有 destinationFileGetObject() 进行下载
  • 处理该文件并输出到本地文件
  • 上传输出文件至 Amazon S3 存储桶中(方法
这样可以将 AWS 代码与处理代码分离,更容易维护。

将文件读入内存/缓冲区,然后在 Lambda 中即时处理它,然后将修改/操作后的数据写回到 S3。如上所述,putObject 只会将最后一行写入 S3。 - Parachute
如果本地文件在AWS Elasticbeanstalk-TomCat容器上,那么操作方式是否相同? - Java bee
@DuracellDeMonaco 请创建一个新问题,而不是在旧问题的评论中提问。 - John Rotenstein
1
根据上述内容,您无法附加或修改S3对象。一个选项是使用AWS存储网关。https://aws.amazon.com/about-aws/whats-new/2016/11/aws-storage-gateway-provides-a-file-interface-to-objects-in-your-amazon-s3-buckets/ - Chai Ang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接