2016-08-23 3 views
4

Ich bekomme NaN während der Berechnung der Standardabweichung (Stddev). Dies ist ein sehr einfacher Anwendungsfall, wie unten beschrieben:Spark 1.5.2: NaN während der Berechnung stddev

val df = Seq(("1",19603176695L),("2", 26438904194L),("3",29640527990L),("4",21034972928L),("5", 23975L)).toDF("v","data") 

Ich habe die stddev als UDF definiert:

def stddev(col: Column) = { 
     sqrt(mean(col*col) - mean(col)*mean(col)) 
} 

Ich erhalte NaN, wenn ich die UDF nennen, wie unten dargestellt:

df.agg(stddev(col("data")).as("stddev")).show() 

Es produziert die folgenden:

+------+ 
|stddev| 
+------+ 
| NaN| 
+------+ 

Was mache ich falsch?

Antwort

3

Angesichts Ihrer Daten werden sowohl mean(col*col) als auch mean(col)*mean(col) größer als ein Maximalwert von Long10 sein. Sie können versuchen, Eingabespalten double Gießen zuerst:

df.agg(stddev(col("data").cast("double")).as("stddev")) 

aber im Allgemeinen wird es nicht besonders stabil sein, auf eine sehr große Zahl.

+0

Wie behandelt Spark 1.6 große Zahlen? Gibt es einen besseren Weg, Stddev in diesem Fall zu berechnen? – Neel

+0

Warum funktioniert es auch, wenn man es verdoppelt? – Neel

+0

Weil 'Double.MaxValue' ungefähr 1.79e308 ist, während' Long.MaxValue' ungefähr 9.2e18 ist. – zero323

Verwandte Themen