Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark-如何使用有状态映射器平面映射已排序的RDD?_Apache Spark_Rdd - Fatal编程技术网

Apache spark Spark-如何使用有状态映射器平面映射已排序的RDD?

Apache spark Spark-如何使用有状态映射器平面映射已排序的RDD?,apache-spark,rdd,Apache Spark,Rdd,基本上,我有一个包含一系列事件的RDD/DataFrame(带有一些categoryId)。它们有时间戳,并按时间排序。 我想做的是扫描每个类别中的所有事件,同时保持/更新一些状态,以记住是否看到了某些事件。例如: 用户登录amazon(记录新会话id、时间戳) 用户将项目添加到basked(将篮子大小增加到1) 用户执行签出(增加支出金额,以输出rdd添加项目:sessionId+开始时间戳+数字(如果项目+支出金额)) 用户向篮子中添加其他内容 执行签出->将下一项添加到输出rdd 因此

基本上,我有一个包含一系列事件的RDD/DataFrame(带有一些categoryId)。它们有时间戳,并按时间排序。 我想做的是扫描每个类别中的所有事件,同时保持/更新一些状态,以记住是否看到了某些事件。例如:

  • 用户登录amazon(记录新会话id、时间戳)
  • 用户将项目添加到basked(将篮子大小增加到1)
  • 用户执行签出(增加支出金额,以输出rdd添加项目:sessionId+开始时间戳+数字(如果项目+支出金额))
  • 用户向篮子中添加其他内容
  • 执行签出->将下一项添加到输出rdd
因此,我非常希望使用有状态映射器(可以记住前面的项目)来制作平面映射。地图绘制者可以按类别ID绘制“州”地图。但是有数百万个类别是什么呢?有没有比按类别+时间戳排序更好的方法?
我还需要确保整个类别位于单个节点上。在这种情况下,我应该按类别划分吗?我不确定数百万个分区是否是个好主意。

因为你的问题很一般,你会得到一个一般的答案。除非你有充分的理由不使用,否则你应该使用和

上面的第一项将为您带来的所有好处。第二个应提供您可能需要的操作,以处理您的数据,如您所述:

  • 按分区
    -按类别划分数据
  • 按时间戳排序
    -按时间戳排序
  • 框架
    /
    范围
    )-窗口大小的可选限制
  • 执行所需操作的实际操作
旁注

我不确定数百万个分区是否是个好主意

不,这根本不是一个好主意,但按某个键进行分区并不意味着您需要与唯一键数量相同的分区数量:

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了。