如何使用 Dataflow 在 GCS 上自动编辑超过 100k 的文件?
How to automatically edit over 100k files on GCS using Dataflow?
我在 Google 云存储上有超过 10 万个文件,其中包含 JSON 个对象,我想创建一个镜像来维护文件系统结构,但有一些字段从文件内容中删除。
我尝试在 Google Cloud Dataflow 上使用 Apache Beam,但它会拆分所有文件,我无法再维护结构。我正在使用 TextIO
.
我的结构类似于reports/YYYY/MM/DD/<filename>
但 Dataflow 输出到 output_dir/records-*-of-*
.
如何让Dataflow不拆分文件并以相同的目录和文件结构输出?
或者,是否有更好的系统可以对大量文件进行这种编辑?
您不能为此直接使用 TextIO
,但 Beam 2.2.0 将包含一项功能,可帮助您自己编写此管道。
如果您可以在 HEAD 处构建 Beam 的快照,那么您已经可以使用此功能了。 注意:API 在撰写此答案和 Beam 2.2.0 发布之间可能会略有变化
- 使用
Match.filepatterns()
创建 PCollection<Metadata>
个匹配文件模式 的文件
- 将
PCollection<Metadata>
映射到 ParDo
,使用 FileSystems
对每个文件执行您想要的操作:
- 使用
FileSystems.open()
API 读取输入文件,然后使用标准 Java 实用程序来处理 ReadableByteChannel
。
- 使用
FileSystems.create()
API写入输出文件。
请注意,Match
是一个非常简单的 PTransform
(在后台使用 FileSystems
),您可以在项目中使用它的另一种方法是复制粘贴(将其代码的必要部分)添加到您的项目中,或研究其代码并重新实现类似的东西。如果您对更新 Beam SDK 版本犹豫不决,这可能是一个选项。
我在 Google 云存储上有超过 10 万个文件,其中包含 JSON 个对象,我想创建一个镜像来维护文件系统结构,但有一些字段从文件内容中删除。
我尝试在 Google Cloud Dataflow 上使用 Apache Beam,但它会拆分所有文件,我无法再维护结构。我正在使用 TextIO
.
我的结构类似于reports/YYYY/MM/DD/<filename>
但 Dataflow 输出到 output_dir/records-*-of-*
.
如何让Dataflow不拆分文件并以相同的目录和文件结构输出?
或者,是否有更好的系统可以对大量文件进行这种编辑?
您不能为此直接使用 TextIO
,但 Beam 2.2.0 将包含一项功能,可帮助您自己编写此管道。
如果您可以在 HEAD 处构建 Beam 的快照,那么您已经可以使用此功能了。 注意:API 在撰写此答案和 Beam 2.2.0 发布之间可能会略有变化
- 使用
Match.filepatterns()
创建PCollection<Metadata>
个匹配文件模式 的文件
- 将
PCollection<Metadata>
映射到ParDo
,使用FileSystems
对每个文件执行您想要的操作:- 使用
FileSystems.open()
API 读取输入文件,然后使用标准 Java 实用程序来处理ReadableByteChannel
。 - 使用
FileSystems.create()
API写入输出文件。
- 使用
请注意,Match
是一个非常简单的 PTransform
(在后台使用 FileSystems
),您可以在项目中使用它的另一种方法是复制粘贴(将其代码的必要部分)添加到您的项目中,或研究其代码并重新实现类似的东西。如果您对更新 Beam SDK 版本犹豫不决,这可能是一个选项。