带有先前值列表的 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 中看到)。
我不太确定如何使用 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 中看到)。