带有先前值列表的 Spark Streaming RDD

Spark Streaming RDD with a list of previous values

我不太确定如何使用 Spark Streaming 做到这一点,这真让我头疼。 我有一些用户的输入流,例如 User1、User2 等,带有一些参数,这些参数目前并不重要。然后我对这些参数做一些处理并得到用户的当前状态,例如可以是 A、B、C,如下所示:

   (User1, A)
   (User2, B)
   (User3, B)

在不久的将来的某个时候,我得到了一组新的事件,可能是这样的:

   (User1, C)
   (User2, B)
   (User3, A)

到目前为止没问题。棘手的部分是如何为最后 X 秒内的所有事件生成一个结构如下的 RDD:

   (User1, (A, C))
   (User2, (B, B))
   (User3, (B, A))

如果不是很明显,我想生成用户在过去 X 秒内所处的先前状态的列表。有没有办法通过 Spark Streaming 实现这一目标?到目前为止,我通常会使用 Esper 来执行此操作,但 Spark Streaming 看起来仍然对这项工作有用。

上面的例子我并没有局限于一个元组,括号只是为了解释这个过程。

编辑:

这是我目前的代码示例。

val userZone = positions.map(position =>
      if (
        position.latitude > 45.445 &&
          position.latitude < 45.48 &&
          position.longitude > 9.14 &&
          position.longitude < 9.24)
        (position, "center")
      else (position, "out")

    val groupedByZones = userZone.groupByKeyAndWindow(Seconds(120))
    groupedByZones.foreachRDD(rdd =>
    {
      rdd.foreach(record => {
        println(record._1.userid + ":" + record._2)
      })
    })

所以我想要的输出应该是这样的:

U1: (center, out, center)
U2 (center,center,out)...

但现在我只能得到单独的值,例如:

U1 : center
U1 : out
U1 : center

希望我说清楚了。

所以在 Spark Streaming 中有几种方法可以做到这一点。想到的最简单的是 groupByKeyAndWindow(您可以在 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.streaming.dstream.PairDStreamFunctions 中看到)。