Scala 状态存在时FlatMapGroupWithState行为

Scala 状态存在时FlatMapGroupWithState行为,scala,apache-spark,spark-streaming,spark-structured-streaming,Scala,Apache Spark,Spark Streaming,Spark Structured Streaming,如果在设置新状态(带过期)后,组在初始过期之前的后续时间内被“调用”,则Spark group state永不过期 我正在为任何组状态设置“5秒”超时。如果我发送一个创建新状态的事件并等待5秒钟,则组将成功超时。但是,如果我发送了一个创建新状态的事件,并且发送了一个同样属于同一组的类似事件,则该组状态永远不会超时 //主课 val aggregation = inputStream .groupByKey(r => r.key) .flatMapGroups

如果在设置新状态(带过期)后,组在初始过期之前的后续时间内被“调用”,则Spark group state永不过期

我正在为任何组状态设置“5秒”超时。如果我发送一个创建新状态的事件并等待5秒钟,则组将成功超时。但是,如果我发送了一个创建新状态的事件,并且发送了一个同样属于同一组的类似事件,则该组状态永远不会超时

//主课

val aggregation = inputStream
        .groupByKey(r => r.key)
        .flatMapGroupsWithState(OutputMode.Append, GroupStateTimeout.ProcessingTimeTimeout)(Aggregator.aggregate)
//在另一个文件中的另一个对象中

object Aggregator {
  def aggregate(key: String,
                rows: Iterator[InputSchema],
                state: GroupState[List[InputSchema]]): Iterator[InputSchema] = {

    if (state.hasTimedOut) {
      print("time out")
      val output = state.get
      state.remove()
      return output.toIterator
    }

    if (state.exists) {
      println("exists")
      state.update(state.get ++ rows.toList)
      return Iterator()
    }
    println("coming to update")
    state.update(rows.toList)
    state.setTimeoutDuration("5 seconds")
    Iterator()
  }
}
使用上述代码,将发生以下情况

1) 如果我在
r.key
12345
的位置发送消息

  • 打印消息
    即将更新
    已打印

  • 5秒后,将打印
    超时

^两者都是预期行为

2) 如果我在时间t1发送一条消息,其中
r.key
abcd
,然后当t2-t1小于
5秒时(这是最初设置的组超时),我在t2发送相同的消息,则会发生以下情况-

  • 打印消息
    即将更新
    已打印(这是t1的第一个事件)

  • 打印消息
    存在
    在t2打印

  • 即使在等待5秒钟后,状态也不会超时,我也不会得到
    超时
    打印

预期的行为应该是从t1开始5秒后,状态应该超时