Spark Streaming RDD,带有先前值列表

时间:2015-03-10 21:21:28

标签: scala apache-spark real-time spark-streaming

我真的不确定如何使用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

我希望我能说清楚。

1 个答案:

答案 0 :(得分:1)

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