如何处理来自Spark RDD

时间:2017-07-13 08:02:22

标签: scala apache-spark rdd

我有一个Spark Scala的问题,它得到每个邻接的两个元素差值大于阈值的值,我创建一个这样的新RDD:

  [2,3,5,8,19,3,5,89,20,17]

我想减去每个两个相邻元素:

 a.apply(1)-a.apply(0) ,a.apply(2)-a.apply(1),…… a.apply(a.lenght)-a.apply(a.lenght-1)

如果结果大于10的阈值,则输出集合,如下所示:

[19,89]

如何使用RDD中的scala执行此操作?

2 个答案:

答案 0 :(得分:1)

如果您有数据

val data = Seq(2,3,5,8,19,3,5,89,20,17)

您可以将rdd创建为

val rdd = sc.parallelize(data)

您可以通过以下方式实现您的目标

import org.apache.spark.mllib.rdd.RDDFunctions._
 val finalrdd = rdd
                  .sliding(2)
                  .map(x => (x(1), x(1)-x(0)))
                  .filter(y => y._2 > 10)
                  .map(z => z._1)

finalrdd.foreach(println)

应该打印

19
89

答案 1 :(得分:0)

你可以从原始数据帧创建另一个RDD并压缩那两个RDD,它创建一个像(2,3)(3,5)(5,8)这样的元组,如果它大于10则过滤减去的结果

val rdd = spark.sparkContext.parallelize(Seq(2,3,5,8,19,3,5,89,20,17))

val first = rdd.first()
rdd.zip(rdd.filter(r => r != first))
  .map( k => ((k._2 - k._1), k._2))
  .filter(k => k._1 > 10 )
  .map(t => t._2).foreach(println)

希望这有帮助!