Google cloud dataflow 如何处理GCS文件模式,一次处理完整文件?

Google cloud dataflow 如何处理GCS文件模式,一次处理完整文件?,google-cloud-dataflow,Google Cloud Dataflow,我需要处理一个(GCS)文件桶,其中每个文件都经过压缩,并包含一条多行JSON记录。另外,正在处理的文件的名称很重要,我需要在转换中知道它 从文档中的示例开始,TextIO看起来非常接近,但它看起来像是被设计成逐行处理每个文件,不允许我一次读取整个文件。而且,我看不到任何方法来获取正在处理的文件名 PCollectionTuple results = p.apply(TextIO.Read .from("gs://bucket/a/*.gz") .withCompressionT

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

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

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

看起来我需要写一个自定义IO阅读器,或者类似的东西?关于最佳开始位置有什么建议吗?

您是正确的,现在没有一个现有的类能够完全满足您的需要。有两种合理的方法:

  • 自己匹配文件模式(使用and)并使用
    Create.of(filenames)
    将结果文件包装到
    PCollection
    中,其中字符串将是文件名。然后使用读取给定文件名的函数应用
    ParDo
  • 编写自己的子类(也有FileBasedSource,但它并不适合您的用例)。它将由filepattern配置,
    splitIntoBundles
    将匹配filepattern并扩展到每个对应于一个文件的单独源中

我会推荐第一种方法,因为它看起来代码更少,而且您的用例不需要
源代码的全部功能

谢谢,我最终使用GcsIOChannelFactory来执行匹配,效果非常好。