在 Apache Beam/Google Cloud Dataflow 上创建文件和数据流

Creating a file and streaming in data on Apache Beam/Google Cloud Dataflow

我没有为我的用例找到任何文档或任何其他 questions/answers。我想我会 post 一个问题。

在 Apache Beam/Google Cloud Dataflow 上,我需要接收 PubSub 消息,根据此消息中的信息从 BigQuery 生成动态查询,从 BigQuery 中提取包含 batchID 的行,为每个 batchID 创建一个文件 Google Cloud Storage,然后将行流式传输到 batchID 文件。对于每个 BigQuery 行(表示为 JSON 字符串),我会检查其 batchID,然后将其作为新行添加到正确的 batchID 文件中。

我想通了 PubSub 和 BigQuery 的东西。我现在处于获得字符串 PCollection 的阶段(每个字符串都是来自 BigQuery 的一行;字符串按 batchID 分组)。

我愿意:

  1. 查看每个字符串的 batchID,因为它进来了
  2. 如果此 batchID 的文件不存在,则创建一个新文件,否则什么都不做
  3. 将每个字符串添加到与其 batchID 对应的文件中的新行

换句话说,我想为每个 batchID 创建一个文件,并在它们进入时将字符串流式传输到这些文件。我真的很想避免在内存中将所有 batchID 字符串聚合在一起(可能是GB 的数据),然后写入文件。

您可以对 batchID 执行 GroupByKey,然后遍历写入文件的值。 GroupByKey 的可迭代对象不需要装入内存。

请注意,如果您正在写入文件,您可能需要写入一个临时位置,然后重命名以实现幂等。