Java 使用Spark检测大型数据集中重复的连续值

Java 使用Spark检测大型数据集中重复的连续值,java,apache-spark,reduce,Java,Apache Spark,Reduce,干杯 最近我一直在尝试Spark,到目前为止,我已经观察到了非常有趣的结果,但目前我一直被著名的groupByKeyOOM问题所困扰。基本上,这项工作是在大型数据集中搜索测量值连续增加至少N倍的周期。通过将结果写入磁盘,我成功地解决了这个问题,但是应用程序现在运行得慢多了(这是由于磁盘IO的缘故)。现在的问题是:是否有其他内存有效的策略,我可以运行排序数据并检查相邻值(对于同一个键)是否在至少N个连续观察中增加,而无需重复使用groupByKey方法 我设计了一个算法来使用reduceByKey

干杯

最近我一直在尝试Spark,到目前为止,我已经观察到了非常有趣的结果,但目前我一直被著名的
groupByKey
OOM问题所困扰。基本上,这项工作是在大型数据集中搜索测量值连续增加至少N倍的周期。通过将结果写入磁盘,我成功地解决了这个问题,但是应用程序现在运行得慢多了(这是由于磁盘IO的缘故)。现在的问题是:是否有其他内存有效的策略,我可以运行排序数据并检查相邻值(对于同一个键)是否在至少N个连续观察中增加,而无需重复使用groupByKey方法

我设计了一个算法来使用
reduceByKey
,但有一个问题,reduce似乎忽略了数据排序,并在最后大喊完全错误的结果


非常感谢您的建议。

有几种方法可以解决此问题:

  • 使用自定义分区器和排序重新分区和SortWithinPartitions

    • keyBy
      (名称、时间戳)对
    • 创建只考虑名称的自定义分区器
    • 使用自定义分区器重新分区和SortWithinPartitions
    • 使用
      mapPartitions
      迭代数据并生成匹配序列
  • sortBy(Key)
    -这与第一个解决方案类似,但以额外的后处理为代价提供了更高的粒度

    • keyBy
      (名称、时间戳)对
    • sortByKey
    • 使用
      mapPartitionsWithIndex
      处理单个分区,跟踪每个分区的前导/尾随模式
    • 调整最终结果以包括跨越多个分区的模式
  • 使用
    mllib.rdd.rdd函数中的
    滑动
    ,在排序数据上创建固定大小的窗口

    • 排序(名称、时间戳)
    • 创建包含多个
      名称的滑动RDD和筛选窗口
    • 检查是否有任何窗口包含所需的图案

您如何表达订单?或者换句话说,是什么使值相邻?@zero323数据由变量名、时间戳和度量值组成。时间戳是我对数据进行排序的字段。变量名是关键。实现了您提出的第一个策略,似乎执行时没有内存问题。谢谢!