我有一个聚合,用于查看客户购买的30天窗口滑动(1天),按客户ID键入,其值为购买金额。我按键总结了这些值,从而获得了过去30天内每位客户的总购买金额。我将此号码存储在外部数据库的客户记录中。
我的问题是:如果客户在过去30天内没有购买任何东西,我该如何自动将客户记录重置为默认值,在这种情况下为零?我更愿意将我的所有逻辑保留在Dataflow中,并避免做太多工作,因为这需要进行相当大的扩展。我基本上在寻找一种方法来自动获取当前窗口中不的每个键的键值,但是中的最后一个键值是潜在的可配置默认值。
答案 0 :(得分:1)
试着回答我自己的问题,但希望得到关于此解决方案是否会扩展的反馈意见:
我想过在初始窗口和总和之后有一步。此变换每天会收到(customerId, purchaseSum)
个元素,因为30天的窗口总和可用。由于这些元素是带时间戳的(我相信最新输入元素的时间戳)我可以重新对它们进行窗口化。如果我创建一个为期一天的两天窗口,那么我将能够按键分组并处理(customerId, [purchaseSumA, purchaseSumB])
在过去30天内购买两者的客户和在过去31天内。在这种情况下,我发出purchaseSumB
。但是,如果只有列表中的元素,并且时间戳表示购买是在31天前进行的,我可以假设从那时起没有从客户购买,我需要发出{{1} }。这有意义吗?
答案 1 :(得分:0)
是否可以稍微修改数据库架构?我想现在你有类似
的东西(customer_id int, purchases_last_month int)`
相反如何
`(customer_id int, last_purchase datetime, purchases_last_month int)`
此时last_purchase
是此客户上次购买的时间,而purchases_last_month
是指在最后一个月之前的一个月内进行的购买?然后在写入数据库的DoFn
中,您将进行条件更新(merge / upsert),使用当前窗口中的值更新last_purchase
和purchases_last_month
,但仅当last_purchase
增加时。通过这种方式,您可以处理无序或并行处理的窗口,但代价是客户端查询的复杂性略有增加(您可以通过在表格顶部添加视图来解决这个问题)。