Spark流式传输不会打印某些数据

时间:2016-04-29 09:42:53

标签: scala apache-spark spark-streaming

我正在分析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()

1 个答案:

答案 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")