如何从s3解压缩文件并将其保存回s3

时间:2015-12-25 09:35:09

标签: java amazon-s3 unzip emr

我在S3上的存储桶中有一些.zip文件。我需要解压缩并需要将其保存到存储桶中而无需本地文件系统。

我知道S3是静态存储,但我可以通过提供s3存储桶路径来解压缩s3本身的文件。

我有以下问题。

  1. 我可以将存储桶/文件夹的路径传递给FileOutputStream(bucketPath),以便直接在那里解压缩文件。

    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));

  2. S3Object.putObject()也接受输入流作为参数,我可以将ZipEntry直接转换为InputStream并作为带有元数据的参数传递。

  3. 我需要使用EMR执行所有操作(本地文件系统不会出现在图片中)。我可以从s3读取zip文件并使用EMR解压缩文件并将其保存在S3上。

  4. 这是我的代码。

    S3Object s3object = s3Client.getObject(new GetObjectRequest(bucketName,objName));   //sandip.zip
    
    ZipInputStream in = new ZipInputStream(s3object.getObjectContent());
    ZipEntry entry=in.getNextEntry(); // sandip_1.graphml
    try {
        while ((entry!= null)){                         
            s3Client.putObject(bucketName, entry.getName(), new File(entry.getName()));
        }
     }
    catch (IOException e) {
        e.printStackTrace();
    
    }
    

    我当前的代码抛出以下异常。

    Exception in thread "main" com.amazonaws.AmazonClientException: Unable to calculate MD5 hash: sandip_1.graphml (The system cannot find the file specified)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1319)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1273)
    at com.example.testaws.test2.createAdjListZipFiles(Unknown Source)
    at com.example.testaws.test1.main(test1.java:33)
    Caused by: java.io.FileNotFoundException: sandip_1.graphml (The system cannot find the file specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.amazonaws.util.Md5Utils.computeMD5Hash(Md5Utils.java:97)
    at com.amazonaws.util.Md5Utils.md5AsBase64(Md5Utils.java:104)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1316)
    ... 3 more
    

    请给我提示或参考。

1 个答案:

答案 0 :(得分:1)

首先,你是对的一件事。 S3是静态存储,因此您无法直接在S3上执行任何文件级更改。你不知何故必须下载文件,根据需要进行转换并上传回来。

其次,你绝对可以使用EMR。事实上,它会让你的生活变得轻松。试试这个:

  • 创建安装了Hive的EMR群集。

  • 创建一个像这样的Hive表: 创建外部表x { 记录字符串 } location&#39; s3:// blah&#39;;

  • 创建另一个名为y的表,就像上面一样,添加一个:&#39;存储为文本文件&#39;

  • 现在执行&#39;插入覆盖表y从x&#39;中选择记录。

这里,Hive会自动检测输入文件是否被压缩。之后,您所做的就是指示Hive将相同的数据存储在同一个S3位置,但作为文本文件。

P.S.-我无法发布确切的代码或格式正确,因为我在旅途中回答这个问题。但我希望你能得到一般的想法。这肯定会有效,因为我已经这样做了几次。