如何使用Dataflow自动编辑GCS上超过100k的文件?

时间:2017-09-01 23:58:08

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

我在Google云端存储上有超过10万个包含JSON对象的文件,我想创建一个维护filesytem结构的镜像,但是从文件内容中删除了一些字段。 < / p>

我尝试在Google Cloud Dataflow上使用Apache Beam,但它会拆分所有文件,我无法再维护该结构了。我正在使用TextIO

我的结构类似于reports/YYYY/MM/DD/<filename> 但数据流输出到output_dir/records-*-of-*

如何让Dataflow不拆分文件并使用相同的目录和文件结构输出?

或者,是否有更好的系统可以对大量文件进行此类编辑?

1 个答案:

答案 0 :(得分:1)

您无法直接使用TextIO,但Beam 2.2.0将包含一项可帮助您自行编写此管道的功能。

如果您可以在HEAD上构建Beam的快照,则可以使用此功能。 注意:在撰写此答案和发布Beam 2.2.0之间,API可能会略有变化

  • 使用Match.filepatterns()创建与filepattern匹配的PCollection<Metadata>个文件
  • 使用PCollection<Metadata>使用ParDo映射FileSystems.open(),使用FileSystems对每个文件执行您想要的操作:
    • 使用ReadableByteChannel API读取输入文件,然后使用标准Java实用程序来使用FileSystems.create()
    • 使用Match API编写输出文件。

请注意,PTransform是一个非常简单的FileSystems(在引擎盖下使用Environment="Production=production" ),您可以在项目中使用它的另一种方法是复制粘贴(必要的)它的代码部分到你的项目中,或研究它的代码并重新实现类似的东西。如果您对更新Beam SDK版本犹豫不决,可以选择此选项。