![](/img/trans.png)
[英]What is the difference between Spark Structured Streaming and DStreams?
[英]How to compute difference between timestamps with PySpark Structured Streaming
PySpark 结构化流媒体存在以下问题。
我的 stream 数据中的每一行都有一个用户 ID 和一个时间戳。 现在,对于每一行和每个用户,我想添加一个带有时间戳差异的列。
例如,假设我收到的第一行是:“用户 A,08:00:00”。 如果第二行显示“用户 A,08:00:10”,那么我想在第二行添加一个名为“间隔”的列,表示“10 秒”。
有谁知道如何实现这一目标? 我尝试使用结构化流文档的 window 函数示例,但它没有用。
非常感谢
由于我们正在谈论结构化流和“每一行和每个用户” ,这告诉我您应该使用带有某种流聚合( groupBy
和groupByKey
)的流查询。
对于流式聚合,您只能依靠结构化流中的微批处理 stream 执行。 这使得单个用户的记录可能是两个不同微批次的一部分。 这表明您需要一个 state。
综上所述,您需要有状态的流式聚合。
有了这个,我想你想要一个Arbitrary Stateful Operations ,即KeyValueGroupedDataset.mapGroupsWithState
或KeyValueGroupedDataset.flatMapGroupsWithState
(见KeyValueGroupedDataset ):
许多用例需要比聚合更高级的有状态操作。 例如,在许多用例中,您必须从事件的数据流中跟踪会话。 为了进行这种会话化,您必须将任意类型的数据保存为 state,并在每个触发器中使用数据 stream 事件对 state 执行任意操作。
从 Spark 2.2 开始,这可以使用操作
mapGroupsWithState
和更强大的操作flatMapGroupsWithState
来完成。 这两个操作都允许您在分组数据集上应用用户定义的代码来更新用户定义的 state。
state 将是每个用户找到的最后一条记录。 这看起来可行。
我的担忧是:
这个流式查询要处理多少用户? (越多状态越大)
何时清理 state(不再期望在流中的用户)? (这将使 state 保持合理的大小)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.