apache-spark - 计算流数据集中事件之间的时间差
问题描述
在我的应用程序中,会为用户执行的每个操作生成事件,并使用以下格式的数据生成事件 -
用户 ID | step_num | event_timestamp
这些事件的流式传输顺序并不完全严格,即我们可能在捕获用户 1 的所有事件之前将用户 2 的数据流化。
样本数据
u1, 1, 2020-05-30 00:00:01
u1, 2, 2020-05-30 00:00:02
u2, 1, 2020-05-30 00:00:02
u3, 1, 2020-05-30 00:00:02
u1, 3, 2020-05-30 00:00:03
……
您将如何实施任何流式解决方案来计算每个步骤所花费的平均时间。我们可以假设用户每一步花费的总时间为 (time_stamp_at_step_1 - time_stamp_at_step_0)。
我正在使用 Spark Streaming 构建解决方案,但找不到任何东西来计算从 2 个事件中获取数据的统计数据,这些事件按属性(在我的情况下为 user_id)分组。很想知道在 Flink、Kafka 等其他流媒体技术中是否有任何可用的解决方案。
解决方案
这可以通过 Flink 以多种方式完成,但一种方法是将 Flink SQL 与 MATCH_RECOGNIZE 一起使用:
SELECT step_num, AVG(seconds)
FROM events
MATCH_RECOGNIZE (
PARTITION BY userId
ORDER BY eventTime
MEASURES
this_step.userId as id
this_step.step AS step_num
TIMESTAMPDIFF(SECOND, this_step.eventTime, next_step.eventTime) AS seconds
AFTER MATCH SKIP TO LAST next_step
PATTERN (this_step next_step)
DEFINE
this_step AS TRUE,
next_step AS next_step.step = this_step.step + 1
)
GROUP BY step_num
推荐阅读
- javascript - 从对象数组构建/创建多维对象javascript
- r - 安装 BiocManager 包的代码是什么?
- c# - 在完整的 .NET Framework 4.6 中使用 ASP.NET Core 功能
- javascript - chrome 浏览器在打印预览页面和保存的 pdf 文件上不显示 png 图像
- django - 在 Visual Studio 中运行 Django 测试时出错
- ssl - Siddhi http-sink 忽略 ssl 证书错误
- c# - 使用 Lambda 表达式堆叠 where 条件
- python - 在 Python 中从 TransientModel 中检索值
- javascript - React 应用程序,绝对定位的子节点未相对于其相对定位的父节点定位(在 Chrome 中)
- corda - 无法使用 gradle integrationTest 从 CLI 运行基于驱动程序的测试