Apache spark Spark-如何使用有状态映射器平面映射已排序的RDD?
基本上,我有一个包含一系列事件的RDD/DataFrame(带有一些categoryId)。它们有时间戳,并按时间排序。 我想做的是扫描每个类别中的所有事件,同时保持/更新一些状态,以记住是否看到了某些事件。例如:Apache spark Spark-如何使用有状态映射器平面映射已排序的RDD?,apache-spark,rdd,Apache Spark,Rdd,基本上,我有一个包含一系列事件的RDD/DataFrame(带有一些categoryId)。它们有时间戳,并按时间排序。 我想做的是扫描每个类别中的所有事件,同时保持/更新一些状态,以记住是否看到了某些事件。例如: 用户登录amazon(记录新会话id、时间戳) 用户将项目添加到basked(将篮子大小增加到1) 用户执行签出(增加支出金额,以输出rdd添加项目:sessionId+开始时间戳+数字(如果项目+支出金额)) 用户向篮子中添加其他内容 执行签出->将下一项添加到输出rdd 因此
- 用户登录amazon(记录新会话id、时间戳)
- 用户将项目添加到basked(将篮子大小增加到1)
- 用户执行签出(增加支出金额,以输出rdd添加项目:sessionId+开始时间戳+数字(如果项目+支出金额))
- 用户向篮子中添加其他内容
- 执行签出->将下一项添加到输出rdd
我还需要确保整个类别位于单个节点上。在这种情况下,我应该按类别划分吗?我不确定数百万个分区是否是个好主意。因为你的问题很一般,你会得到一个一般的答案。除非你有充分的理由不使用,否则你应该使用和 上面的第一项将为您带来的所有好处。第二个应提供您可能需要的操作,以处理您的数据,如您所述:
-按类别划分数据按分区
-按时间戳排序按时间戳排序
(框架
/行
)-窗口大小的可选限制范围
- 执行所需操作的实际操作
import org.apache.spark.HashPartitioner
val rdd = sc.parallelize(
(1 to 10).flatMap(k => (1 to 100).map(_ => (k, scala.util.Random.nextInt)))
).partitionBy(new HashPartitioner(2))
在上面的示例中,您有10个不同的值,但只有2个分区。有意义。我想是时候升级到1.4了。