【问题标题】:Can I update an existing Amazon S3 object?我可以更新现有的 Amazon S3 对象吗?
【发布时间】:2012-03-20 00:08:38
【问题描述】:

我正在查看 Amazon S3 示例,这些示例用于插入/删除...

但我想用新数据更新现有 blob。基本上内容是一个文本文件,并且文本已经修改,我希望S3对象存储新的文本内容。

如何在 Java 中做到这一点?

【问题讨论】:

    标签: java amazon-s3 amazon-web-services


    【解决方案1】:

    更新Amazon S3 中的现有对象与首先创建它没有区别,即使用相同的PUT Object 操作上传对象​​并将覆盖现有对象(如果它不受保护通过其他方式,例如通过Using Bucket PoliciesObject Versioning)

    你可以在Upload an Object Using the AWS SDK for Java找到完整的代码示例,主要部分归结为:

    AmazonS3 s3client = new AmazonS3Client(new PropertiesCredentials(
            S3Sample.class.getResourceAsStream(
                    "AwsCredentials.properties")));
    try {
        System.out.println("Uploading a new object to S3 from a file\n");
        File file = new File(uploadFileName);
        s3client.putObject(new PutObjectRequest(
                                 bucketName, keyName, file));
    
     } catch (AmazonServiceException ase) {
        System.out.println("Caught an AmazonServiceException, which " +
                "means your request made it " +
                "to Amazon S3, but was rejected with an error response" +
                " for some reason.");
        // ... error handling based on exception details
    }
    

    【讨论】:

    • Steffen 还说的是没有“部分 blob”更新。您需要上传文件的整个新副本。
    • @Steffen - 我是 S3 的新手,因此有一个快速相关的问题 - 如果我有一个 1 GB 的巨大 csv 文件,例如在 S3 存储桶中,我想向其中添加新行。执行此操作的最佳方式是什么?
    【解决方案2】:

    您可以使用 Athena 通过 INSERT 函数更新额外的行。您需要向 Athena 提供对 S3 存储桶的访问权限,使用 Amazon Glue 抓取 S3 存储桶以获取表布局,更新 Glue 以获取架构名称和数据类型。完成此操作后,您可以使用 Athena 控制台进行更新,地址为 https://console.aws.amazon.com/athena/home

    INSERT INTO destination_table [(col1,col2,...)]
    VALUES (col1value,col2value,...)[,(col1value,col2value,...)][,...]
    

    【讨论】:

    • 我认为这仍然会在后台执行 PUT 操作。
    • 我相信这发生在服务器上,所以虽然仍然是 put 操作,但用户不需要下载、转换和加载数据。我的经验是节省大量时间。
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多