apache-spark - 用于窗口聚合和自定义触发的 Apache Spark 结构化流
问题描述
假设我有一些模式的流数据,如下所示:
uid: string
ts: timestamp
现在假设数据已被分区uid
(在每个分区中,数据是最小的,例如小于 1 行/秒)。
我想根据事件时间将数据(在每个分区中)放入窗口中ts
,然后对每个窗口中的所有元素进行排序(也基于ts
),最后按顺序对窗口中的每个元素应用自定义转换.
Q1:有什么方法可以得到窗口的聚合视图,但保留每个元素,例如将窗口中的所有元素具体化为一个列表?
Q2:如果Q1可以,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。可能吗?
解决方案
在我回答问题之前,让我指出 Spark Structured Streaming 提供KeyValueGroupedDataset.flatMapGroupsWithState
(之后Dataset.groupByKey
)用于任意状态流聚合(具有显式状态逻辑),这为您提供了手动流状态管理的最大优势。
Q1:有什么方法可以得到窗口的聚合视图,但保留每个元素,例如将窗口中的所有元素具体化为一个列表?
这听起来像是一个流式连接,您的左侧是输入流,右侧是聚合流(流式聚合)。这应该是可行的(但没有示例代码,因为我仍然不确定我是否理解你的问题)。
Q2:如果Q1可以的话,我想设置一个水印和触发组合,在窗口结束时触发一次,然后要么定期触发,要么每次延迟数据到达时触发。可能吗?
使用window
标准函数来定义窗口和水印以在适当的时候“关闭”窗口。这也是可行的(但不再举例,因为我不确定这个问题的价值)。
推荐阅读
- c# - 在 .NET Core 中调用 POSIX 的 `exec` 函数
- c# - Binding data from datagrid to ui components
- matlab - 从 DLL 文件调用 MATLAB
- perl - How can I force and error on an undefined hash key?
- r - How do I specify col_types using read_csv in ldply()?
- python - Iterating through dictionaries and Accumulation
- sql-server - 验证 SQL Server 触发器是否正在捕获所有记录更改
- javascript - 如何让 Express 意识到我的 Teradata 数据库调用存在错误?
- google-apps-script - 有没有办法存储当前单元格的值并将其恢复到 Google 表格中?
- javascript - 字符串比较返回 false