在我的应用程序中,为用户执行的每个操作生成事件,并且使用以下格式的数据生成事件 -
user_id | step_num | event_timestamp
这些事件的流式传输顺序并不完全严格,即在捕获用户 1 的所有事件之前,我们可能会将用户 2 的数据流式传输进来。
示例数据
U1, 1, 2020-05-30 00:00:01
U1, 2, 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