如何使用spark / scala计算RDD中两个相邻数字的总和?

时间:2017-05-31 09:32:13

标签: scala apache-spark rdd

我想计算RDD中两个相邻数字的总和,我的快速和肮脏的方法是首先创建一个数组,然后获得两个相邻数字的总和,但这是如此丑陋和低效,

   val rdd = sc.parallelize(1 to 9)
    val sumNum:RDD[Int] =rdd.mapPartitions((parIter=>{
      var sum=new ArrayBuffer[Int]()
      var result=new ArrayBuffer[Int]()
      while (parIter.hasNext) {
        result.append(parIter.next())
      }
      for(i<-0 until result.length-1){
        sum.append(result(i)+result(i+1))
      }
      sum.toIterator
    }))
    sumNum.collect().foreach(println)

无论如何,有更好的解决方案吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

为方便起见,您应该使用Window api中的DataFrame函数。这是一个可重复的例子:

import org.apache.spark.sql.functions.{col,sum}
import org.apache.spark.sql.expressions.Window

// Define window: current and next row
val w = Window.partitionBy().orderBy("value").rowsBetween(0,1)

// Calculate sum over the defined window
rdd.toDF()
  .withColumn("cumSum", sum(col("value"))
  .over(w)).show()
+-----+------+
|value|cumSum|
+-----+------+
|    1|     3|
|    2|     5|
|    3|     7|
|    4|     9|
|    5|    11|
|    6|    13|
|    7|    15|
|    8|    17|
|    9|     9|
+-----+------+