【发布时间】:2019-11-01 19:11:27
【问题描述】:
我已经创建了类并使用该类来创建 RDD。我想计算每个分区的 LoudnessRate (类成员)的总和。这个总和稍后将用于计算每个分区的平均 LoudnessRate。 我尝试了以下代码,但它不计算总和并返回 0.0。 我的代码是
object sparkBAT {
def main(args: Array[String]): Unit = {
val numPartitions = 3
val N = 50
val d = 5
val MinVal = -10
val MaxVal = 10
val conf = new SparkConf().setMaster(locally("local")).setAppName("spark Sum")
val sc = new SparkContext(conf)
val ba = List.fill(N)(new BAT(d, MinVal, MaxVal))
val rdd = sc.parallelize(ba, numPartitions)
var arrSum =Array.fill(numPartitions)(0.0) // Declare Array that will hold sum for each Partition
rdd.mapPartitionsWithIndex((k,iterator) => iterator.map(x => arrSum(k) += x.LoudnessRate)).collect()
arrSum foreach println
}
}
class BAT (dim:Int, min:Double, max:Double) extends Serializable {
val random = new Random()
var position : List[Double] = List.fill(dim) (random.nextDouble() * (max-min)+min )
var velocity :List[Double] = List.fill(dim)( math.random)
var PulseRate : Double = 0.1
var LoudnessRate :Double = 0.95
var frequency :Double = math.random
var fitness :Double = math.random
var BestPosition :List[Double] = List.fill(dim)(math.random)
var BestFitness :Double = math.random
}
【问题讨论】:
-
您正在修改执行程序 JVM 中的
arrSum并在驱动程序 JVM 中打印其值。您可以将迭代器映射到单例迭代器并使用collect将值移动到驱动程序。另外,不要使用iterator.map来产生副作用,iterator.foreach就是为此而生的 -
@ollik1 这应该是一个答案(如果您添加代码)。
-
@ollik1 你能加代码吗?
-
@AlexeyRomanov 和 yari,很公平,添加了代码作为答案
标签: scala apache-spark rdd partitioning