如何从Cloud Dataflow中的PCollection中提取内容?

时间:2015-01-18 23:15:50

标签: google-cloud-dataflow

只想知道如何从PCollection中提取内容? 假设我已经应用了Count.Globally,因此在生成的PCollection中只有一个数字,但是如何将其提取为Long值?

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

考虑一个简单的例子,其目标是打印出Count。在管道运行之前,Count一直无法使用。所以在这种情况下我们可以做以下

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

答案 1 :(得分:1)

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

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