Google cloud dataflow 处理窗口聚合中的默认值

Google cloud dataflow 处理窗口聚合中的默认值,google-cloud-dataflow,Google Cloud Dataflow,我有一个聚合,它查看客户购买的滑动30天窗口(1天周期),由客户id键入,值为购买金额。我按键汇总这些值,从而得到每个客户在过去30天内的总购买金额。我将此号码存储在外部数据库中的客户记录中 我的问题是:如果客户在过去30天内没有购买任何东西,我如何自动将客户记录重置为默认值,在这种情况下为零?我更愿意将所有逻辑都保留在数据流中,避免做太多的工作,因为这需要进行相当大的扩展。我基本上是在寻找一种方法来自动获取每个键的键值,这些键不在当前窗口中,但在最后一个窗口中,并且该值可能是可配置的默认值。试

我有一个聚合,它查看客户购买的滑动30天窗口(1天周期),由客户id键入,值为购买金额。我按键汇总这些值,从而得到每个客户在过去30天内的总购买金额。我将此号码存储在外部数据库中的客户记录中


我的问题是:如果客户在过去30天内没有购买任何东西,我如何自动将客户记录重置为默认值,在这种情况下为零?我更愿意将所有逻辑都保留在数据流中,避免做太多的工作,因为这需要进行相当大的扩展。我基本上是在寻找一种方法来自动获取每个键的键值,这些键不在当前窗口中,但在最后一个窗口中,并且该值可能是可配置的默认值。

试图回答我自己的问题,但希望得到有关此解决方案是否可以扩展的反馈:


我曾考虑过在初始窗口和总和之后进行一步。此转换将每天接收一次
(customerId,purchaseSum)
元素,因为30天窗口总和可用。因为这些元素都有时间戳(我相信是最新输入元素的时间戳),所以我可以重新打开它们的窗口。如果我创建一个为期一天的两天窗口,那么我将能够按键分组,并为在过去30天和31天内购买过产品的客户处理
(customerId[purchaseSumA,purchaseSumB])
。在本例中,我发出
purchaseSumB
。但是,如果列表中只有in元素,并且时间戳表明购买是在31天前完成的,那么我可以假设从那时起没有从客户处购买,并且我需要发出
(customerId,0)
。这有意义吗?

是否可以选择稍微修改数据库模式?我想你现在有点像

(customer_id int, purchases_last_month int)`
相反,你呢

`(customer_id int, last_purchase datetime, purchases_last_month int)`

其中此时间
last\u purchase
是该客户最后一次购买的时间,
purchases\u last\u month
是指在最后一次购买之前的一个月内进行的购买?然后在写入数据库的
DoFn
中,您将进行条件更新(合并/升级),该更新使用当前窗口中的值更新
last\u purchase
purchases\u last\u month
,但前提是
last\u purchase
正在增加。通过这种方式,您可以处理无序或并行处理的窗口,但代价是客户端查询的复杂性略有增加(您可以通过在表顶部添加一个视图来解决此问题)。

您是否可以澄清:一旦您看到客户至少一次,如果他们不再购买任何产品,您是否希望看到他们的数据永远出现在每个窗口中?否:如果他们只购买一种产品,我希望看到一次
(customerId,amount)
元素,以及当购买事件从窗口中退出时一个
(customerId,0)
元素。因此,30天内(1天期限)窗口,(customerId,amount)元素将与30个30天长的窗口相关联,在购买当天滑动。您希望(customerId,0)在哪个窗口或多个窗口中移动元素出现?如果您解释为什么需要此零元素,可能会有所帮助-它是否有助于下游处理?可能有一种更简单的方法可以实现您的最终目标。我只希望元素出现在一个窗口之后,在该窗口中,给定键有一个实际值。基本上,我是在外部数据库中升级客户配置文件带有“上个月采购”字段的ase。如果我不确定是否以某种方式发出了默认值,则该字段在购买后将永远不会重置为零。抱歉,延迟。您似乎假设窗口将按时间顺序处理。这不是情况-Beam编程模型不保证这一点。同一密钥的不同窗口可能会在-顺序,甚至是并行。让我想一想如何解决这个问题。我不确定这是一个选项——我将把这些记录发送到系统外,任何其他应用程序都可以通过PubSub订阅它们……如果你使用流媒体管道,如果你没有很晚或很晚的时间,这听起来很可能在实践中起作用然而,这同样是对不同的数据(customerId,[purchaseSumA,purchaseSumB])的顺序的假设窗口元素即使在单个customerId中也会被处理-它们可能以不同的顺序处理,也可能并行处理。如果您的数据或多或少按顺序到达,这种情况很可能不会发生,但一旦违反此假设,所有赌注都将被取消。嗯。我记得阅读了数据流源代码(不记得在哪里)看到一个变换使用了一个技巧来获取窗口中一个键的所有值–它使用了一个空的主输入pcollection,但实际的pcollection作为侧输入。如果一个键的值的数量很低(数百,最多数千),这是否可行?“窗口中有一个键的所有值”不幸的是,在具有延迟数据的管道中,也不是一个定义良好的概念