如何一次处理GCS filepattern,完整文件?

时间:2015-03-31 15:16:28

标签: google-cloud-dataflow

我需要处理一个(GCS)文件桶,其中每个文件都被压缩并包含一个多行JSON记录。此外,正在处理的文件的名称很重要,我需要在我的转换中知道它。

从文档中的示例开始,TextIO看起来非常接近,但看起来它的设计是逐行处理每个文件,并且不允许我一次读取整个文件。另外,我没有看到任何方法来获取正在处理的文件名?

PCollectionTuple results = p.apply(TextIO.Read
    .from("gs://bucket/a/*.gz")
    .withCompressionType(TextIO.CompressionType.GZIP)
    .withCoder(MyJsonCoder.of()))

看起来我需要编写一个自定义IO阅读器,或者其他一些?有关最佳起点的提示吗?

1 个答案:

答案 0 :(得分:4)

你是对的,现在没有一个现有的类完全符合你的要求。有两种合理的方法:

  • 自己匹配filepattern(使用IOChannelUtilsIOChannelFactory)并使用PCollection<String>将生成的文件包装到Create.of(filenames),其中String将是文件名。然后应用ParDo和一个读取给定文件名的函数。
  • 编写自己的Source子类(还有FileBasedSource,但它不适合您的用例)。它将由filepattern配置,splitIntoBundles将匹配filepattern并扩展为各个源,每个源对应一个文件。

我会推荐第一种方法,因为它似乎代码较少而且您的用例不需要Source的全部功能。