我想计算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)
无论如何,有更好的解决方案吗? 谢谢!
答案 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|
+-----+------+