Google cloud dataflow 如何在云数据流中从PCollection中提取内容?

Google cloud dataflow 如何在云数据流中从PCollection中提取内容?,google-cloud-dataflow,Google Cloud Dataflow,只是想知道如何从PCollection中提取内容? 假设我已经应用了一个Count.Globally,那么结果PCollection中只有一个数字,但是如何将其提取为长值呢 谢谢。这取决于您希望如何使用该值 如果您想在管道完成后读取该值,您可以使用一个写转换(例如)将其写入某个输出,然后从管道完成后执行的任何代码中读取 如果希望在管道的后续部分中使用该值,则可以应用transfrom生成PCollectionView,然后将其作为侧面输入传递给其他变换 考虑一个简单的例子,目标是打印出计数。直到

只是想知道如何从PCollection中提取内容? 假设我已经应用了一个Count.Globally,那么结果PCollection中只有一个数字,但是如何将其提取为长值呢


谢谢。

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

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

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

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

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

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


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

我想我希望获得一个长值并在程序中使用。假设在if语句中使用。我添加了一个示例,这是否回答了您的问题?重要的是,在管道运行之前,PCollection不会具体化。因此,您需要运行管道才能访问该值。管道也可以(取决于运行程序)异步运行,独立于主程序。Jeremy,即使我们已经运行了管道,是否真的没有直接的方法来访问计数?将其写入磁盘然后再读回似乎是非常间接的。您可以在管道中实现它,但不能在主程序中实现它。您的主程序正在构建转换图。如果您在数据流服务上执行该图,那么计算实际上是在不同的机器上执行的,而不是在主程序运行的机器上执行的。因此,为了让主程序读取数据,您需要使用IO转换将其写入主程序可访问的位置(例如文件/BigQuery/Datastore/Pubsub)。但是,如果您想在以后的转换中读取它,数据流将为您传递该值。