我正在探索KeyValueGroupedDataset.flatMapGroupsWithState
中的Spark结构化流中的任意状态聚合。
KeyValueGroupedDataset.flatMapGroupsWithState
运算符的签名如下:
flatMapGroupsWithState[S: Encoder, U: Encoder](
outputMode: OutputMode,
timeoutConf: GroupStateTimeout)(
func: (K, Iterator[V], GroupState[S]) => Iterator[U]): Dataset[U]
OutputMode
参数的用途是什么?
在检查源物理运营商FlatMapGroupsWithStateExec的源代码时,我找不到将使用OutputMode
的任何地方。
答案 0 :(得分:1)
确实,我也没有发现任何用途。我对此有几种理论:
此处的模式与org.apache.spark.sql.catalyst.plans.logical.FlatMapGroupsWithState
逻辑运算符的签名保持一致。如果您选择org.apache.spark.sql.execution.SparkStrategies.BasicOperators
Apply方法,您会发现逻辑运算符经常将其所有参数传递给物理运算符。我不确定,但这看起来像是设计指南,但这只是我的假设。
这也可能是遗留原因。 FlatMapGroupsWithState
是从MapGroupsWithState
演变而来的,目的是强制输出模式语义。它是在以下PR中实现的:https://github.com/apache/spark/pull/17197/files(SPARK-19858),其中MapGroupsWithState
重命名为FlatMapGroupsWithState
,并且添加了outputMode
作为参数。也许-如果我先前的理论是错误的-仅仅是因为它通过了PR,而没有人因为“它已经在这里”的原则而抱怨它了?
将来是否可能将outputMode
传递给映射函数?我发现用于保存流聚合(StateStoreSaveExec
)的节点使用输出模式来找出要保留在状态存储中的条目。如评论btw所述,也许它将很快为*withState
转换添加一项新功能:
- @param outputMode
func
的输出模式