2016-05-02 3 views
0

Для данных потоковой передачи DStream[(Double, Double)], как я могу оценить ошибку квадрата среднего квадрата? См. Мой код ниже. Линия math.sqrt(summse), где у меня есть проблема (код не компилируется):Как использовать math.sqrt для 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: код не компилируется: Cannot resolve reference sqrt with such signature. Expected: Double, Actual: Unit

+1

Так в чем проблема? Не компилируется, не выполняется время выполнения или неправильное значение? – thoredge

+0

@thoredge: код не компилируется: 'Невозможно разрешить ссылочный sqrt с такой подписью. Ожидаемое: Double, Actual: Unit' – Klue

+0

Что вы хотите сделать? calculateRMSE of DStream, в какой момент времени? DStreams - бесконечные потоки, поэтому вы не можете ожидать выполнения операции 'f (DStream)' и получить из нее скалярное значение, потому что результат будет зависеть от времени. – maasg

ответ

1

метод foreachRDD (...) возвращает единицу, так что ожидается. Согласно документам, результат записывается обратно в этот (выходной) DStream. Я предполагаю, что вам придется применять sqrt.

+0

Я не уверен, что понимаю, что вы точно имеете в виду. Не могли бы вы добавить пример, пожалуйста? Как применить sqrt для вывода внутри данной функции? (очевидно, это не должно быть 'math.sqrt (output)') – Klue

+0

@Klue добавить аннотацию типа к вашему 'summse', и это должно стать ясным. 'math.sqrt' требует' Double' –

Смежные вопросы