我正在尝试检查在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();
}
最初文件不存在,所以Exception但是在try创建时有此消息“输出路径不存在或不可写”
你知道如何创造全新的道路吗?
谢谢
答案 0 :(得分:1)
您可以使用选项withoutValidation来阻止验证,但它会在gs中创建相应的存储桶。但如果父存储桶不存在,它将抛出异常
在你的情况下,如果&#34; failbucket&#34;存储桶不存在它会抛出以下错误。
引起:java.io.IOException:无法写入GCS路径gs://failbucket/foo/boo/ret/xxx.txt
但如果&#34; failbucket&#34;存储桶存在于您的gs项目中,如果这些存储桶不存在,它将创建foo / boo / buckets。
在你的情况下,如果&#34; failbucket&#34;桶存在于你的gs中
lines.apply(TextIO.Write.named("Write new Document")
.to("gs://failbucket/foo/boo/ret")
.withoutValidation()
.withSuffix(".txt"));
答案 1 :(得分:1)
您的异常处理代码似乎正在提交Dataflow管道,其唯一目的是在Google云端存储中创建一个空文件。
这不是特别有效。相反,您可以直接使用Google Cloud Storage API与GCS存储桶进行交互。为此,此API更加高效和全面。例如,您可以在启动主Dataflow管道之前使用此API。
另一种方法是试用gsutil
工具。此命令行工具具有与GCS存储桶交互的类似功能。您也可以在启动Java程序之前从Java程序或单独调用它。
通常不鼓励在数据流中禁用TextIO
验证的方法。在云平台中开始执行管道之前,此验证可以提供快速且早期捕获错误的好处。也就是说,在作业提交时无法验证先决条件的极少数情况下,应禁用验证。