我一直在Spark Streaming中使用mapWithState
API,但有两件事情并不清楚StateSpec.function
:
让我们说我的功能是:
def trackStateForKey(batchTime: Time,
key: Long,
newValue: Option[JobData],
currentState: State[JobData]): Option[(Long, JobData)]
为什么新值为Option[T]
类型?就我所见,它总是为我定义,并且因为该方法应该以新状态调用,所以我真的不明白为什么它可以是可选的。
返回值是什么意思?我试图在文档和源代码中找到一些指针,但没有一个描述它的用途。由于我使用state.remove()
和state.update()
修改了某个键的状态,为什么我必须对返回值执行相同的操作?
在我当前的实现中,如果我删除密钥,则返回None
,如果我更新密码,则返回Some(newState)
,但我不确定这是否正确。
答案 0 :(得分:18)
为什么新值为
Option[T]
类型?就我所见,它确实如此 总是为我定义,因为该方法应该被调用 对于一个新的国家,我真的不明白为什么会这样 可选的。
如果您使用Option[T]
设置超时,则为StateSpec.timeout
,例如:
StateSpec.function(spec _).timeout(Milliseconds(5000))
然后,一旦函数超时,传入的值将为None
,而isTimingOut
上的State[T]
方法将为true。这是有道理的,因为状态的超时并不意味着已经为指定的密钥到达了一个新值,并且通常比null
传递T
更安全(这不会是&#39} ;无论如何都要为原语工作),因为您希望用户能够安全地操作Option[T]
。
你可以在Sparks实现中看到:
// Get the timed out state records, call the mapping function on each and collect the
// data returned
if (removeTimedoutData && timeoutThresholdTime.isDefined) {
newStateMap.getByTime(timeoutThresholdTime.get).foreach { case (key, state, _) =>
wrappedState.wrapTimingOutState(state)
val returned = mappingFunction(batchTime, key, None, wrappedState) // <-- This.
mappedData ++= returned
newStateMap.remove(key)
}
}
返回值是什么意思?我试图找到一些指针 文档和源代码,但没有一个描述它是什么 用于。因为我使用state.remove()修改键的状态 和state.update(),为什么我必须对返回做同样的事情 值?
返回值是一种沿着spark图传递中间状态的方法。例如,假设我想更新我的状态,但也使用中间数据在我的管道中执行某些操作,例如:
dStream
.mapWithState(stateSpec)
.map(optionIntermediateResult.map(_ * 2))
.foreachRDD( /* other stuff */)
该返回值正是允许我继续操作所述数据的原因。如果您不关心中间结果并且只想要完整状态,那么输出None
就完全没问了。
我已经写了blog post(在此问题之后),试图对API进行深入解释。