我在S3上的存储桶中有一些.zip文件。我需要解压缩并需要将其保存到存储桶中而无需本地文件系统。
我知道S3是静态存储,但我可以通过提供s3存储桶路径来解压缩s3本身的文件。
我有以下问题。
我可以将存储桶/文件夹的路径传递给FileOutputStream(bucketPath)
,以便直接在那里解压缩文件。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
S3Object.putObject()
也接受输入流作为参数,我可以将ZipEntry直接转换为InputStream并作为带有元数据的参数传递。
我需要使用EMR执行所有操作(本地文件系统不会出现在图片中)。我可以从s3读取zip文件并使用EMR解压缩文件并将其保存在S3上。
这是我的代码。
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
请给我提示或参考。
答案 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.-我无法发布确切的代码或格式正确,因为我在旅途中回答这个问题。但我希望你能得到一般的想法。这肯定会有效,因为我已经这样做了几次。