【发布时间】:2020-08-11 09:31:16
【问题描述】:
我正在从 PubSub 读取事件,目标是将它们分组到窗口中。我想让每个窗口的结束与每小时的 0、15、30 和 45 分钟一致。
由于这是一个流式作业,它可以随时启动,我想找到一种方法使第一个窗口的大小与下一个窗口的大小对齐。
这将是流:
- 启动作业
- 定义为
window_size从这一刻到下一刻钟之间的剩余时间 - 从第一个窗口的末尾开始,设置
window_size = int(15*60)(秒)。
例如:
- 启动作业
- 现在是 11:18,所以修复
window_size = (11:30-11:18).seconds - 当第一个窗口结束时,设置
window_size = int(15*60)(秒)
在 Google 提供的一个示例中,使用窗口化的管道定义如下,其中 window_size 是用户作为输入传递的参数:
def expand(self, pcoll):
return (
pcoll
| "Window into Fixed Intervals" >> beam.WindowInto(window.FixedWindows(self.window_size))
| "Add Key" >> beam.Map(lambda elem: (None, elem))
| "Groupby" >> beam.GroupByKey()
| "Abandon Key" >> beam.MapTuple(lambda _, val: val)
)
【问题讨论】:
-
根据documentation,窗口化根据其各个元素的时间戳细分PCollection。话虽如此,我想先问一下你的工作是如何执行的?
-
正如我在问题中提到的,它是一个流式作业,它从 PubSub 接收事件,将它们分组到窗口中,然后在管道的后续步骤中执行其他操作。我想了解是否有可能在执行期间调整窗口大小,将一个 window_size 分配给第一个窗口,从第二个窗口开始分配另一个。
标签: python google-cloud-dataflow apache-beam windowing