我需要处理一个(GCS)文件桶,其中每个文件都被压缩并包含一个多行JSON记录。此外,正在处理的文件的名称很重要,我需要在我的转换中知道它。
从文档中的示例开始,TextIO看起来非常接近,但看起来它的设计是逐行处理每个文件,并且不允许我一次读取整个文件。另外,我没有看到任何方法来获取正在处理的文件名?
PCollectionTuple results = p.apply(TextIO.Read
.from("gs://bucket/a/*.gz")
.withCompressionType(TextIO.CompressionType.GZIP)
.withCoder(MyJsonCoder.of()))
看起来我需要编写一个自定义IO阅读器,或者其他一些?有关最佳起点的提示吗?
答案 0 :(得分:4)
你是对的,现在没有一个现有的类完全符合你的要求。有两种合理的方法:
PCollection<String>
将生成的文件包装到Create.of(filenames)
,其中String将是文件名。然后应用ParDo
和一个读取给定文件名的函数。splitIntoBundles
将匹配filepattern并扩展为各个源,每个源对应一个文件。我会推荐第一种方法,因为它似乎代码较少而且您的用例不需要Source
的全部功能。