首页 > 解决方案 > 根据时间或结束标记聚合流中的记录

问题描述

考虑表示用户交互(例如产品购买)的交织记录输入流的概念。想象一下,我们收到表明用户已将产品放入购物篮的记录。一段时间后,他们执行结帐......或......放弃他们的购物车。

因此,我收到了一系列记录,例如:

我的目标是从管道中输出交易的总和。例如,鉴于上述情况,我想输出:

Transaction 123, Items A, B, ... Sale completed

或者如果在最后一次活动后 24 小时内没有退房:

Transaction 123, Items A, B, ... Sale abandoned

...这就是我卡住的地方。我觉得有一些方法可以从 Apache Beam 管道的角度来思考这个故事,但恐怕我不知道从哪里开始。我在想我想以某种方式通过事务和终止来对记录进行窗口化,并且仅在收到事务结束记录或自上次看到的记录以来经过一段时间间隔时才发出批处理进行处理。

标签: google-cloud-dataflowapache-beam

解决方案


基于数据的窗口标记对 Beam 不支持的数据排序有一个固有的假设。在上述方案中,假设结帐事件将在所有添加到购物车事件之后发生。

但是,要以粗略的方式解决此问题,您可以使用State和 Session 窗口以粗略的方式表达这一点。

PCollection-RawEvents:读取原始事件

PCollection-1:PCollection-RawEvents ->SessionWindow对所有事件应用 24 小时。

PCollection-Checkout:PCollection-1 -> 将所有元素推入BagState. Transaction 123, Items A, B, ... Sale completed当您收到 checkout 事件时, 读回状态并发布事件Transaction: 123, Checked out basket

PCollection-Abandon:PCollection-1 -> GroupByKey ->Transaction 123, Items A, B, ... Sale abandoned如果Transaction: 123, Checked out basket不存在则发布。

PCollection-Unified:展平(PCollection-Checkout、PCollection-Abandon)


推荐阅读