当前位置: 首页 > 知识库问答 >
问题:

解压缩数据流中的.tar文件?

东郭弘
2023-03-14

我的GCP云存储桶中有很多.tar文件。每个.tar文件都有多个图层。我想使用GCP数据流解压缩这些.tar文件,并将它们放回另一个GCP存储桶中。

我找到了Google提供的用于批量解压缩云存储文件的实用工具模板,但它不支持.tar文件扩展名。

也许我应该在上传到云端之前尝试解压文件,或者Beam中是否存在其他内容?

每个tar文件未经压缩大约有15 TB。

共有1个答案

廖琪
2023-03-14

这个片段借用了批量解压缩模板的代码。它也借用了这个问题

正如您所注意到的,不支持TAR,但一般来说,Beam中的压缩/解压缩似乎依赖于apachecommons的压缩库。

您可以编写一个管道来执行以下操作:

// Create the pipeline
Pipeline pipeline = Pipeline.create(options);

// Run the pipeline over the work items.
PCollectionTuple decompressOut =
    pipeline
        .apply("MatchFile(s)",
            FileIO.match().filepattern(options.getInputFilePattern()))
        .apply(
            "DecompressFile(s)",
            ParDo.of(new Decompress(options.getOutputDirectory());

您的<code>解压缩

class Dearchive extends DoFn<MatchResult.Metadata, String> {
  @ProcessElement
  public void process(@Context ProcessContext context) {
    ResourceId inputFile = context.element().resourceId();
    String outputFilename = Files.getNameWithoutExtension(inputFile.toString());
    ResourceId tempFileDir =
          this.outputDir.resolve(outputFilename, StandardResolveOptions.RESOLVE_DIRECTORY);
    
    TarArchiveInputStream tarInput = new TarArchiveInputStream(
        Channels.newInputStream(FileSystems.open(inputFile)));

    TarArchiveEntry currentEntry = tarInput.getNextTarEntry();

    while (currentEntry != null) {
        br = new BufferedReader(new InputStreamReader(tarInput)); // Read directly 
        ResourceId outputFile = tempFileDir.resolve(currentEntry.getName(), 
            StandardResolveOptions.RESOLVE_FILE);
        try (WritableByteChannel writerChannel = FileSystems.create(tempFile, MimeTypes.TEXT)) {
          ByteStreams.copy(tarInput, Channels.newOutputStream(writerChannel));
        }
        context.output(outputFile.toString());
        currentEntry = tarInput.getNextTarEntry(); // Iterate to the next file
    }
  }
}

这是一个非常粗糙且未经测试的代码片段,但它应该让你走上正确的道路。LMK,如果我们应该进一步澄清。

 类似资料:
  • 我正在使用Apache Commons Compress创建tar归档并解压它们。我的问题从这个方法开始:

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 本文向大家介绍Linux下的tar压缩解压缩命令详解(小结),包括了Linux下的tar压缩解压缩命令详解(小结)的使用技巧和注意事项,需要的朋友参考一下 tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选

  • 本文向大家介绍C#文件流进行压缩和解压缩的方法,包括了C#文件流进行压缩和解压缩的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#文件流进行压缩和解压缩的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我通常使用压缩,使用解压(由于习惯使用gzip)。 我最近得到了一个带有超线程的四核CPU,所以我有8个逻辑核,我注意到许多核在压缩/解压过程中没有使用。 有什么方法可以利用未使用的内核来加快速度吗?

  • 问题内容: 我正在使用以下代码来压缩和解压缩字符串数据,但是我面临的问题是,它很容易被压缩而不会出错,但是decompress方法会引发以下错误。 线程“主”中的异常java.io.IOException:不是GZIP格式 仍然不知道如何解决此问题!!! 问题答案: 这是因为 发送您可以从中获得的,并在其中使用它来构建您的。以下是需要在代码中进行的更改。