3

只是想知道如何从 PCollection 中提取东西?假设我已经应用了一个 Count.Globally,所以在生成的 PCollection 中有一个数字,但是如何将它提取为 Long 值?

谢谢。

4

2 回答 2

3

这取决于您想如何使用该值。

如果您想在管道完成后读取该值,您可以使用一种写入转换(例如AvroIO.Write)将其写入某个输出,然后您可以在管道完成后从执行的任何代码中读取这些输出。

如果您想在管道的后续部分中使用该值,则可以应用View转换来生成 PCollectionView,然后您可以将其作为侧面输入传递给其他转换。

考虑一个简单的例子,目标是打印出计数。直到管道运行后,计数才可用。所以在这种情况下,我们可以执行以下操作

  • 定义一个 DoFn<Long, String> 我们将其应用于计数,以便将 Long 转换为我们要打印的消息。
  • 应用 TextIO.Write 转换将消息写入文件。
  • 运行作业并等待它完成。如果我们想使用 Dataflow Service 执行,我们可以使用BlockingDataflowRunner来等待作业完成。
  • 作业完成后,阅读为获取消息而创建的文本文件并将其打印出来。
于 2015-01-19T02:21:38.867 回答
1

您必须始终将其PCollection视为。事实上,您应用了为每个窗口创建单个值的转换并不能保证实际上只有单个值。这取决于窗口策略 - 因此在您使用 GlobalWindow 的情况下可能有单个值,但对于其他类型的窗口函数(例如滑动窗口)会有很多值。

因此,不可能直接提取这个单个值(例如类似PCollection.get()的东西)——返回值必须是一个流。如果要从 PCollection 检索结果,则必须对其应用转换,将其存储在某处。有一组丰富的内置 IO 模块(参见此处)。如果您想检索结果值,并稍后在程序中使用它,最好的选择是将其存储在您选择的某个共享数据库中,并在管道完成后检索此值。请注意,这意味着您的管道是有界的(例如批处理,而不是流式传输),否则它将永远不会完成。但是您的问题表明您想到的是有界管道。

于 2021-04-22T08:17:42.990 回答