根据时间或结束标记聚合流中的记录

Aggregate records in a stream based on time or end marker

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

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

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

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

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

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

...这就是我被困的地方。我觉得有一些方法可以从 Apache Beam 管道的角度来思考这个故事,但恐怕我不知道从哪里开始。我在想我想以某种方式 window 交易和终止的记录,并且只在收到交易记录的 end 或某个时间时发出批处理自上次看到记录以来已经过去了时间间隔。

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

然而,要粗略地解决这个问题,您可以使用 State 和 Session window 来粗略地表达它。

PCollection-RawEvents:读取原始事件

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

PCollection-Checkout:PCollection-1 -> 推送 BagState 中某个键的所有元素。当您收到结帐事件 Transaction: 123, Checked out basket.

时,回读状态并发布事件 Transaction 123, Items A, B, ... Sale completed

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

PCollection-Unified:扁平化(PCollection-Checkout,PCollection-Abandon)