Apache spark 如何使用flatMapGroupsWithState进行有状态聚合?
应用Apache spark 如何使用flatMapGroupsWithState进行有状态聚合?,apache-spark,spark-structured-streaming,Apache Spark,Spark Structured Streaming,应用flatMapGroupsWithState时,我收到以下错误消息 线程“main”org.apache.spark.sql.AnalysisException中的异常:流数据帧/数据集上的聚合不支持更新模式下的flatMapGroupsWithState 以下是我正在尝试做的 阅读来自卡夫卡的消息并解析它 基于特定维度的分组 为每个组运行UDAF并计算每个组的聚合agg不返回KeyValueGroupDataSet,因此在上一步输出中将groupByKey应用到基于agg函数列的组 使用
flatMapGroupsWithState
时,我收到以下错误消息
线程“main”org.apache.spark.sql.AnalysisException中的异常:流数据帧/数据集上的聚合不支持更新模式下的flatMapGroupsWithState
以下是我正在尝试做的
- 阅读来自卡夫卡的消息并解析它
- 基于特定维度的分组
- 为每个组运行UDAF并计算每个组的聚合
不返回agg
,因此在上一步输出中将KeyValueGroupDataSet
应用到基于groupByKey
列的组agg函数
- 使用
将此聚合合并到流的上一个状态flatMapGroupsWithState
agg(..)
后无法应用flatMapGroupsWithState
此错误是否意味着在数据集上应用agg(..)
后无法应用flatMapGroupsWithState
不是真的。上面说(我的)
流式数据帧/数据集上的聚合不支持更新模式下的flatMapGroupsWithState
这意味着您使用默认的输出模式,即更新
,但应该是完整
或附加
,如Spark官方文档中所述(请参阅“使用flatMapGroupsWithState的查询”查询类型)
从评论中可以看出: 而且
flatMapGroupWithState
也支持更新操作。从KeyValueGroupedDataset
,if(outputMode!=outputMode.Append&&outputMode!=outputMode.Update){抛出新的IllegalArgumentException(“函数的输出模式应为Append或Update”)}
没错,flatMapGroupWithState
支持追加和更新输出模式,但仅当作为输入参数的一部分提供时。请参见KeyValueGroupedDataset.flatMapGroupWithState
的签名:
flatMapGroupsWithState[S, U](
outputMode: OutputMode, // <-- HERE
timeoutConf: GroupStateTimeout)(
func: (K, Iterator[V], GroupState[S]) ⇒ Iterator[U]): Dataset[U]
flatMapGroupsWithState[S,U](
outputMode:outputMode//