我真的不确定如何使用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
我希望我能说清楚。
答案 0 :(得分:1)
因此在Spark Streaming中有几种方法可以做到这一点。想到的最简单的是groupByKeyAndWindow(你可以在http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.streaming.dstream.PairDStreamFunctions中看到)。