对于火花流,有没有办法只能为当前窗口维护状态?我理解updateStateByKey
的作用,但除非我们清除它,否则它将永远保持状态。是否可以存储和重置每个窗口的状态?
提供更多背景信息。我正试图在窗口流中将一种类型的对象转换为另一种对象。但是,转换如下:
对象1是调用或响应。
在我们看到调用和响应之前,对象2不被认为是完整的。
但是,由于对象的响应可以在单独的批处理中,因此我需要在批处理中维护状态。
但我只希望保持当前窗口的状态。我有什么方法可以通过火花实现这一目标。
谢谢!
您可以使用mapWithState转换而不是updateStateByKey,并且可以使用批处理间隔的持续时间设置超出状态规范的时间。由此您可以每次只有最后一批的状态。但是如果您的调用和响应取决于它,它将起作用只有在最后一批。另外明智的当你尝试更新被删除的密钥时它将抛出异常。与updateStateByKey相比,MapwithState的性能更快。
您可以在下面找到示例代码段。
import org.apache.spark.streaming._
val stateSpec =
StateSpec
.function(updateUserEvents _)
.timeout(Minutes(5))