DStream updateStateByKey 更新函数实现

DStream updateStateByKey update function implementation

阅读文档、源代码和示例后,我试图了解 updateStateByKey 的不同方法签名以及何时使用一个比另一个更合适。

具体是下面的我没看懂API:

def updateStateByKey[S: ClassTag](
  updateFunc: (Iterator[(K, Seq[V], Option[S])]) => Iterator[(K, S)],
  ...
)

在什么情况下我会创建一个 updateFunc 并且 returns 一个 Iterator 而不是实现 (Seq[V], Option[S]) => Option[S] 函数?

虽然 (Seq[V], Option[S]) => Option[S] 只会让您 "see" 一个密钥的先前(如果有)和当前值,但您无法访问密钥本身。

使用 (Iterator[(K, Seq[V], Option[S])]) => Iterator[(K, S)] 您也可以根据键做出决策,例如 "have I seen this key"、"have I seen all these keys",将键与决策逻辑中的值进行比较或仅保留一个子集键的数量(例如 "top-k")。