在我的应用程序中,将为用户执行的每个操作生成事件,并使用以下格式的数据生成事件-
user_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