2016-08-23 17 views
4

標準偏差(stddev)を計算しながらNaNを取得しています。Spark 1.5.2:stddevを計算中のNaN

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

私はUDFのように定義STDDEVています:以下に示すように

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

私はNaNを取得しています、私はUDFを呼び出す:

以下に説明するように、これは非常に単純なユースケースであります

+------+ 
|stddev| 
+------+ 
| NaN| 
+------+ 
df.agg(stddev(col("data")).as("stddev")).show() 

これは、次の生成します

私は何が間違っていますか?

答えて

3

データが与えられた場合、mean(col*col)mean(col)*mean(col)の両方が最大値のLongより大きくなります。あなたはdouble最初に入力列をキャストしてみてください:

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

が、一般的には非常に大きな数に特に安定ではありません。

+0

Spark 1.6はどのように大きな数値を処理しますか?この場合、stddevを計算する良い方法はありますか? – Neel

+0

また、なぜダブルにキャストすると機能するのですか? – Neel

+0

'Double.MaxValue'はおおよそ1.79e308であり、' Long.MaxValue'はおよそ9.2e18です。 – zero323