google-cloud-dataflow - 根据时间或结束标记聚合流中的记录
问题描述
考虑表示用户交互(例如产品购买)的交织记录输入流的概念。想象一下,我们收到表明用户已将产品放入购物篮的记录。一段时间后,他们执行结帐......或......放弃他们的购物车。
因此,我收到了一系列记录,例如:
- 交易:123,将物品 A 加入购物篮
- 交易:123,将 B 项添加到购物篮
- ...
- 交易:123,已签出篮子
我的目标是从管道中输出交易的总和。例如,鉴于上述情况,我想输出:
Transaction 123, Items A, B, ... Sale completed
或者如果在最后一次活动后 24 小时内没有退房:
Transaction 123, Items A, B, ... Sale abandoned
...这就是我卡住的地方。我觉得有一些方法可以从 Apache 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)
推荐阅读
- mongodb - 入口点命令如何在这里工作
- html - 如何以三种不同的方式对齐弹性项目?
- docker - docker-compose 在不运行命令的情况下启动/启动
- reactjs - onClick 发布请求并重定向到另一个页面
- regex - 删除 Atom 中现有文件的尾随换行符
- python - PostgreSQL。如何使用python复制一行中单元格的值并将其粘贴到同一表中另一行的另一个单元格中
- c# - AutoMapper - 具有多个相同类型属性的 ProjectTo 类
- php - 来自数据库的php数据不显示
- javascript - 显示进度条
- sql - 当字段为空时从 SQL 数据透视表中删除行