我正在阅读PubSub的事件,目标是将它们分组到windows中。我希望每个窗口的结尾与每小时的0、15、30和45分钟一致。
由于这是一个流媒体作业,它可以随时启动,我想找到一种方法,将第一个窗口的大小与下一个窗口的大小对齐。
这将是流:
window_size
这一时刻到下一刻钟之间的剩余时间window_size = int(15*60)
(秒)李>例如:
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)
)
您的用例非常适合Beam
首先,有一个基本的概念问题需要澄清:
如果你不把这两者结合或混淆,你会更成功。Windows不会将“开始”或“结束”作为作业处理时间的一部分。Windows始终“存在”
使用15分钟的
FixedWindows
可以做你想做的事情。每个事件都与它所处的15分钟间隔相关联。启动作业或事件到达以进行处理时,不会影响此操作更新:添加示例以说明:
假设您在11:18启动您的作业(如您的问题所述),并假设传入事件大约在同一时间生成。假设出现以下事件,并显示时间戳:
元素将按如下方式分配给窗口:
请注意,窗口分配与您开始作业的时间、事件到达的时间或到达的顺序无关。实际上,您可以明天开始,或者在存档数据上重新运行,或者在顺序不接近的数据上重新运行,结果将是相同的。事件时间窗口基于数据
相关问题 更多 >
编程相关推荐