首页 > 解决方案 > 用于窗口聚合和自定义触发的 Apache Spark 结构化流

问题描述

假设我有一些模式的流数据,如下所示:

uid: string
ts: timestamp

现在假设数据已被分区uid(在每个分区中,数据是最小的,例如小于 1 行/秒)。

我想根据事件时间将数据(在每个分区中)放入窗口中ts,然后对每个窗口中的所有元素进行排序(也基于ts),最后按顺序对窗口中的每个元素应用自定义转换.

Q1:有什么方法可以得到窗口的聚合视图,但保留每个元素,例如将窗口中的所有元素具体化为一个列表?

Q2:如果Q1可以,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。可能吗?

标签: apache-sparkspark-structured-streaming

解决方案


在我回答问题之前,让我指出 Spark Structured Streaming 提供KeyValueGroupedDataset.flatMapGroupsWithState(之后Dataset.groupByKey)用于任意状态流聚合(具有显式状态逻辑),这为您提供了手动流状态管理的最大优势。


Q1:有什么方法可以得到窗口的聚合视图,但保留每个元素,例如将窗口中的所有元素具体化为一个列表?

这听起来像是一个流式连接,您的左侧是输入流,右侧是聚合流(流式聚合)。这应该是可行的(但没有示例代码,因为我仍然不确定我是否理解你的问题)。

Q2:如果Q1可以的话,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。可能吗?

使用window标准函数来定义窗口和水印以在适当的时候“关闭”窗口。这也是可行的(但不再举例,因为我不确定这个问题的价值)。


推荐阅读