即使给定的 window 为空,我如何为每个 window 发出摘要数据?
How can I emit summary data for each window even if a given window was empty?
我的应用程序始终发出 "window finished" 消息非常重要,即使 window 为空。我不知道该怎么做。我最初的想法是为每个处理过的记录输出一个 int 并使用 Sum.integersGlobally
,然后基于它发出一条记录,为每个 window 提供一个单例,然后我可以简单地为每个 [= 发出一个摘要记录17=],如果 window 为空则为 0。当然,这会失败,您必须使用 withoutDefaults
,如果 window 为空,那么它什么也不会发出。
Cloud Dataflow 是围绕处理可能高度稀疏的数据的概念构建的。按照设计,它不会想出数据来填补这些稀疏的空白,因为在许多情况下这将是成本高昂的。对于像您这样的非稀疏性实用的用例(为单个全局键创建非稀疏结果),解决方法是将您的主 PCollection
与由空值组成的心跳 PCollection
连接起来。因此,对于 Sum.integersGlobally
的示例,您将 Flatten
您的主要 PCollection<Integer>
和次要 PCollection<Integer>
,每个 window 恰好包含一个零值。这假设您使用的是 window 的可枚举类型(例如 FixedWindows
或 SlidingWindows
;Sessions
根据定义是不可枚举的)。
目前,唯一的方法是编写一个数据生成器程序,将必要的零流注入 Pub/Sub,并带有适合您将使用的 windows 类型的时间戳.如果您写入与主要输入相同的 Pub/Sub 主题,您甚至不需要在代码中添加 Flatten
。缺点是您必须 运行 在某处将其作为一项单独的工作。
将来(一旦我们的自定义源 API 可用),我们应该能够提供一个 PSource
接受一个可枚举的 WindowFn
加上一个默认值并生成一个适当无界PCollection
.
我的应用程序始终发出 "window finished" 消息非常重要,即使 window 为空。我不知道该怎么做。我最初的想法是为每个处理过的记录输出一个 int 并使用 Sum.integersGlobally
,然后基于它发出一条记录,为每个 window 提供一个单例,然后我可以简单地为每个 [= 发出一个摘要记录17=],如果 window 为空则为 0。当然,这会失败,您必须使用 withoutDefaults
,如果 window 为空,那么它什么也不会发出。
Cloud Dataflow 是围绕处理可能高度稀疏的数据的概念构建的。按照设计,它不会想出数据来填补这些稀疏的空白,因为在许多情况下这将是成本高昂的。对于像您这样的非稀疏性实用的用例(为单个全局键创建非稀疏结果),解决方法是将您的主 PCollection
与由空值组成的心跳 PCollection
连接起来。因此,对于 Sum.integersGlobally
的示例,您将 Flatten
您的主要 PCollection<Integer>
和次要 PCollection<Integer>
,每个 window 恰好包含一个零值。这假设您使用的是 window 的可枚举类型(例如 FixedWindows
或 SlidingWindows
;Sessions
根据定义是不可枚举的)。
目前,唯一的方法是编写一个数据生成器程序,将必要的零流注入 Pub/Sub,并带有适合您将使用的 windows 类型的时间戳.如果您写入与主要输入相同的 Pub/Sub 主题,您甚至不需要在代码中添加 Flatten
。缺点是您必须 运行 在某处将其作为一项单独的工作。
将来(一旦我们的自定义源 API 可用),我们应该能够提供一个 PSource
接受一个可枚举的 WindowFn
加上一个默认值并生成一个适当无界PCollection
.