即使给定窗口为空,如何为每个窗口发出摘要数据?

时间:2015-06-16 14:36:46

标签: google-cloud-dataflow

即使窗口为空,我的应用程序始终发出“窗口完成”消息非常重要。我无法弄清楚如何做到这一点。我最初的想法是为每个处理过的记录输出一个int并使用Sum.integersGlobally然后根据它发出一个记录,每个窗口给我一个单例,然后我可以简单地每个窗口发出一个摘要记录,如果是窗户是空的。当然,这会失败,你必须使用withoutDefaults,如果窗口是空的,它将不会发出任何内容。

1 个答案:

答案 0 :(得分:4)

Cloud Dataflow围绕处理可能非常稀疏的数据的概念而构建。通过设计,它不会让人想起数据来填补稀疏性的空白,因为在许多情况下这将成本过高。对于像你这样非粗略实用的用例(为单个全局密钥创建非稀疏结果),解决方法是将主PCollection加入由空值组成的心跳PCollection。因此,对于Sum.integersGlobally的示例,您Flatten您的主PCollection<Integer>的辅助PCollection<Integer>每个窗口只包含一个零值。这假设您使用了可枚举类型的窗口(例如FixedWindowsSlidingWindows; Sessions根据定义是不可枚举的。)

目前,唯一的方法是编写一个数据生成器程序,将必要的零流注入Pub / Sub,并使用适合您将使用的窗口类型的时间戳。如果您将相同的Pub / Sub主题写入主输入,则甚至不需要在代码中添加Flatten。缺点是你必须在某个地方将它作为一个单独的工作运行。

将来(一旦我们的自定义源API可用),我们应该能够提供一个PSource,它接受​​一个可枚举的WindowFn加上一个默认值,并生成一个适当的无界PCollection }。