根据时间或结束标记汇总流中的记录

时间:2019-04-23 02:58:45

标签: google-cloud-dataflow apache-beam

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

因此,我收到一条记录流,例如:

  • 交易:123,将商品A添加到购物篮
  • 交易:123,将商品B添加到购物篮
  • ...
  • 交易:123,已签出购物篮

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

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

或者上次事件发生后24小时内未结帐:

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

...这就是我遇到的问题。我觉得有某种方法可以从Apache Beam管道的角度来思考这个故事,但是恐怕我对从哪里开始感到迷茫。我以为我想以某种方式按事务和终止来对记录进行窗口化,并且仅在接收到事务记录的 end 或自上一条记录以来经过了一定时间间隔时才发出一批以供处理见过。

1 个答案:

答案 0 :(得分:0)

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

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

PCollection-RawEvents:读取原始事件

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

PCollection-Checkout:PCollection-1->将所有元素推入BagState中的键。当您结帐事件Transaction 123, Items A, B, ... Sale completed时,请读回状态并发布事件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)