Java 如果isn';不存在于谷歌云数据流中

Java 如果isn';不存在于谷歌云数据流中,java,google-cloud-storage,google-cloud-dataflow,Java,Google Cloud Storage,Google Cloud Dataflow,我试图检查ParDo中创建的文件与GCS中存储的文件是否不同 为此,我尝试读取文件并比较它们的差异 Pipeline p = Pipeline.create(c.getPipelineOptions()); try { PCollection<String> lines = p.apply( TextIO.Read .named("R

我试图检查ParDo中创建的文件与GCS中存储的文件是否不同

为此,我尝试读取文件并比较它们的差异

        Pipeline p = Pipeline.create(c.getPipelineOptions());
        try {
            PCollection<String> lines = p.apply(
                    TextIO.Read
                            .named("Read Section on GS")
                            .from("gs://failbucket/foo/boo/ret.txt"))
                    .apply(ParDo
                            .of(new Util.viewDifferences2(c.element))
                            .named("only different"));

            lines.apply(
                    TextIO.Write.named("Write Document Different")
                            .to(pathGS)
                            .withSuffix(".json"));

            p.run();

        } catch (Exception e) {
            p = Pipeline.create(c.getPipelineOptions());
            PCollection<String> lines = p.apply(Create.of(sectionContent));

            lines.apply(TextIO.Write.named("Write new Document")
                    .to("gs://failbucket/foo/boo/ret").withSuffix(".txt"));
            p.run();
        }
Pipeline p=Pipeline.create(c.getPipelineOptions());
试一试{
p收集线=p应用(
文本阅读
.命名(“阅读GS部分”)
.from(“gs://failbucket/foo/boo/ret.txt”))
.申请
.of(新的Util.viewDifferences2(c.element))
.命名(“仅不同”);
行。应用(
TextIO.Write.named(“编写不同的文档”)
.to(路径)
.withSuffix(“.json”);
p、 run();
}捕获(例外e){
p=Pipeline.create(c.getPipelineOptions());
PCollection lines=p.apply(创建(节内容));
行。应用(TextIO.Write.named(“编写新文档”)
.to(“gs://failbucket/foo/boo/ret”)。使用suffix(.txt”);
p、 run();
}
最初该文件不存在,因此出现异常,但在尝试创建时会显示以下消息“输出路径不存在或不可写”

你知道如何创建整个新路径吗


谢谢

您可以使用不带验证的选项,该选项将使验证无效,但它将在gs中创建相应的存储桶。但如果父bucket不存在,它将抛出异常

在您的情况下,如果“failbucket”bucket不存在,它将抛出以下错误

原因:java.io.IOException:未能写入GCS路径gs://failbucket/foo/boo/ret/xxx.txt

但是,如果您的gs项目中存在“failbucket”bucket,那么如果这些bucket不存在,它将创建foo/boo/bucket

在您的情况下,如果您的gs中存在“failbucket”bucket,那么下面的代码应该可以

            lines.apply(TextIO.Write.named("Write new Document")
                .to("gs://failbucket/foo/boo/ret")
                .withoutValidation()
                .withSuffix(".txt")); 

您的异常处理代码似乎正在提交一个数据流管道,其唯一目的是在Google云存储中创建一个空文件

这不是特别有效。相反,您可以直接使用与您的GCS存储桶交互。此API在这方面更加高效和全面。例如,您可以在启动主数据流管道之前使用此API

另一种方法是试用该工具。此命令行工具具有与您的GCS bucket交互的类似功能。您也可以在启动Java程序之前从Java程序调用它,或者单独调用它


通常不鼓励在数据流中禁用
TextIO
验证的方法。在云平台中开始执行管道之前,此验证可以提供快速、早期捕获错误的好处。也就是说,在极少数情况下,如果在提交作业时无法验证先决条件,则应禁用验证。

非常感谢,有没有办法检查GCS中是否存在文件。因为没有通过exception@mitchell.p考虑使用接近你所需要的方法。还有一种方法。