Apache Beam TextIO.ReadAll(),处理丢失的文件名?

时间:2018-04-20 21:33:07

标签: java google-cloud-dataflow apache-beam dataflow

我有一个管道步骤块,用于读取GCS存储桶中特定文件的数据。代码类似于下面的代码:

List<String> filepaths = new ArrayList<String>("filepath1", "filepath2", "filepathMissing");

return pipeline
    .apply("GatherFiles", Create.of(filepaths)).setCoder(StringUtf8Coder.of())
    .apply("GatherFileData", TextIO.readAll())        
    .apply("ApplyCustomDoFn", ParDo.of(new CustomDoFn()))
    .apply("Group", GroupByKey.<String, String>create())
    .apply("AnotherCustomDoFn", ParDo.of(new AnotherCustomDoFn()));

如果GCS中缺少其中一个文件路径(例如,缺少“filepathMissing”),则整个管道崩溃。我正在考虑在这组管道步骤中添加一个try / catch,但我不确定这会带来什么后果。

我的问题:

  1. 使用TextIO.readAll()时,try / catch是否可以对可能丢失的文件进行错误处理?
  2. 使用try / catch,如果无法从GCS找到一个文件,那么上述整套步骤是否会失败?
  3. 如果有任何关于如何执行此操作的具体文档,请将其与您的答案相关联:)

1 个答案:

答案 0 :(得分:1)

我最终在上面找到了我的问题的答案。

我必须在TextIO.readAll()之后添加代码。 withEmptyMatchTreatment(EmptyMatchTreatment.ALLOW),如下所示。

select * from [dbo].[UDF_GetTableFromList](' 1:35410:102001001:102001:10:1',':')

此修复程序的一个不幸问题是,如果文件丢失,您的管道将在管道步骤输出INFO消息,但管道外不会抛出任何错误。如果您希望文件存在,除非您在数据流中明确检查管道步骤的日志,否则您可能不知道该文件未被包含。