我正在分析Streaming Spark,除了打印出RMSE之外它工作正常。因此,它打印出预测output.print()
,但它不显示RMSE。有什么想法吗?
def calculateRMSE(output: DStream[(Double, Double)], n: DStream[Long]): Double = {
var summse = 0.0
output.foreachRDD { rdd =>
rdd.map {
case pair: (Double, Double) =>
val err = math.abs(pair._1 - pair._2)
err*err
}.foreach(summse += _)
}
math.sqrt(summse)
}
//..
val trainingData = ssc.textFileStream("file:///home/gosper/Desktop/data/streaming/train").map(LabeledPoint.parse).cache()
val testData = ssc.textFileStream("file:///home/gosper/Desktop/data/streaming/test").map(LabeledPoint.parse)
model.trainOn(trainingData)
val output = model.predictOnValues(testData.map(lp => (lp.label, lp.features)))
output.print()
val rmse = calculateRMSE(output,testData.count())
println(s"RMSE = $rmse")
ssc.start()
ssc.awaitTermination()
答案 0 :(得分:0)
首先,我建议避免更新外部var summse
并使用.sum
(这是map / reduce框架中的reduce操作)
<强> UPD 强> 我最初对解决方案有点不对劲。 这是另一个想法。在流结束后打印值。
var rmse : Double = 0
output.map {
case pair: (Double, Double) ⇒
val err = math.abs(pair._1 - pair._2)
err*err
}.reduce(_ + _).map(math.sqrt).foreachRDD(rdd ⇒ rdd map { rmse = _ })
ssc.start()
ssc.awaitTermination()
println(s"RMSE = $rmse")