flatMapGroupsWithState中OutputMode的用途是什么?如何/在哪里使用?

时间:2019-07-07 11:33:05

标签: apache-spark spark-structured-streaming

我正在探索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的任何地方。

1 个答案:

答案 0 :(得分:1)

确实,我也没有发现任何用途。我对此有几种理论:

  1. 此处的模式与org.apache.spark.sql.catalyst.plans.logical.FlatMapGroupsWithState逻辑运算符的签名保持一致。如果您选择org.apache.spark.sql.execution.SparkStrategies.BasicOperators Apply方法,您会发现逻辑运算符经常将其所有参数传递给物理运算符。我不确定,但这看起来像是设计指南,但这只是我的假设。

  2. 这也可能是遗留原因。 FlatMapGroupsWithState是从MapGroupsWithState演变而来的,目的是强制输出模式语义。它是在以下PR中实现的:https://github.com/apache/spark/pull/17197/filesSPARK-19858),其中MapGroupsWithState重命名为FlatMapGroupsWithState,并且添加了outputMode作为参数。也许-如果我先前的理论是错误的-仅仅是因为它通过了PR,而没有人因为“它已经在这里”的原则而抱怨它了?

  3. 将来是否可能将outputMode传递给映射函数?我发现用于保存流聚合(StateStoreSaveExec)的节点使用输出模式来找出要保留在状态存储中的条目。如评论btw所述,也许它将很快为*withState转换添加一项新功能:

      
        
    • @param outputMode func的输出模式
    •