2016-05-02 11 views
0

Für die Streaming-Daten DStream[(Double, Double)], wie kann ich den quadratischen Mittelfehler schätzen? Siehe meinen Code unten. Die Linie math.sqrt(summse) ist, wo ich ein Problem haben (der Code nicht kompiliert):Wie verwendet man math.sqrt für DStream [(Double, Double)]?

def calculateRMSE(output: DStream[(Double, Double)], n: DStream[Long]): Double = { 
     val summse = output.foreachRDD { rdd => 
      rdd.map { 
       case pair: (Double, Double) => 
       val err = math.abs(pair._1 - pair._2); 
       err*err 
      }.reduce(_ + _) 
     } 
     math.sqrt(summse) 
    } 

UPDATE: Der Code lässt sich nicht kompilieren: Cannot resolve reference sqrt with such signature. Expected: Double, Actual: Unit

+1

Also, was ist dein Problem? Kompiliert nicht, Laufzeitfehler oder falscher Wert? – thoredge

+0

@thoredge: Der Code kompiliert nicht: 'Kann Referenz sqrt mit einer solchen Signatur nicht auflösen. Erwartet: Double, Actual: Unit' – Klue

+0

Was möchten Sie tun? calcumeRMSE eines DStream, zu welchem ​​Zeitpunkt? DStreams sind unendliche Streams. Sie können also nicht erwarten, eine Operation 'f (DStream)' auszuführen und einen Skalarwert daraus zu erhalten, da das Ergebnis von der Zeit abhängt. – maasg

Antwort

1

Verfahren foreachRDD (...) gibt Einheit so das ist zu erwarten. Laut den Dokumenten wird das Ergebnis zurück in den (Ausgang) DStream geschrieben. Ich schätze, du musst sqrt anwenden.

+0

Ich bin mir nicht sicher, ob ich verstehe, was Sie genau meinen. Könnten Sie bitte ein Beispiel hinzufügen? Wie man sqrt anwendet, um innerhalb der gegebenen Funktion auszugeben? (offensichtlich sollte es nicht 'math.sqrt (output)' sein) – Klue

+0

@Klue fügen Sie eine type Annotation zu Ihrem 'summse' hinzu und es sollte klar werden. 'math.sqrt' benötigt ein' Double' –