2017-05-31 72 views
0

我要計算一個RDD相鄰的兩個數字的總和,我的快速和骯髒的方法是先創建一個數組,然後讓兩個相鄰的數之和,但就是這樣醜陋和低效,如何用spark/scala計算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

請分享示例數據和預期輸出。 – mtoto

+0

rdd是sc.parallelize(1到9)並且期望的輸出是總和RDD [Int] = RDD(3,5,7,9,11,13,15,17) – mentongwu

+1

可以將它編輯成問題嗎? – mtoto

回答

1

爲了方便起見,您應該使用DataFrame API中的Window函數。這裏有一個可重複的例子:

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| 
+-----+------+ 
+0

什麼是函數toDF(),我找不到這個函數 – mentongwu

+0

它將你的'rdd'轉換爲'dataframe',見[here](https://spark.apache.org/ docs/latest/api/python/pyspark.sql.html?highlight = todf#pyspark.sql.DataFrame.toDF) – mtoto

+0

@mentongwu你需要像'import sqlContext.implicits._'這樣的隱式轉換工作 –