首页 > 解决方案 > 计算流数据集中事件之间的时间差

问题描述

在我的应用程序中,会为用户执行的每个操作生成事件,并使用以下格式的数据生成事件 -

用户 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 等其他流媒体技术中是否有任何可用的解决方案。

标签: apache-sparkdistributed-computingflink-streamingspark-structured-streaming

解决方案


这可以通过 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

推荐阅读