如何使用PySpark结构化流计算时间戳之间的差异

时间:2019-11-14 13:46:28

标签: apache-spark pyspark spark-structured-streaming

PySpark结构化流媒体存在以下问题。

我的流数据中的每一行都有一个用户ID和一个时间戳。现在,对于每一行和每一位用户,我想添加一列带有时间戳记差异的列。

例如,假设我收到的第一行说:“用户A,08:00:00”。如果第二行说“ User A,08:00:10”,那么我想在第二行中添加一列“ Interval”,说“ 10 seconds”。

有人知道如何实现这一目标吗?我尝试使用结构化流文档的窗口函数示例,但它没有用。

非常感谢您

1 个答案:

答案 0 :(得分:1)

由于我们正在谈论结构化流,并且“每一行,每个用户” 告诉我,您应该将流查询与某种流聚合({{1} groupBy

对于流聚合,您只能在结构化流中依赖微批流执行。这样一来,单个用户的记录就可以成为两个不同微批次的一部分。这使您需要一个状态。

这一切都意味着您需要有状态的流式聚合。

有了这一点,我认为您想要Arbitrary Stateful Operations之一,即groupByKeyKeyValueGroupedDataset.mapGroupsWithState(请参阅KeyValueGroupedDataset):

  

许多用例需要比聚合更多的高级状态操作。例如,在许多用例中,您必须跟踪事件数据流中的会话。为了进行这种会话化,您将必须将任意类型的数据保存为状态,并使用每个触发器中的数据流事件对状态执行任意操作。

     

从Spark 2.2开始,可以使用操作KeyValueGroupedDataset.flatMapGroupsWithState和功能更强大的操作mapGroupsWithState完成此操作。两种操作都允许您将用户定义的代码应用于分组的数据集以更新用户定义的状态。

状态将是每个用户的最新记录。看起来可行。

我担心的是:

  1. 此流查询将要处理多少个用户? (状态越大)

  2. 何时清除状态(对于不再需要流的用户)? (这将使状态保持合理的大小)