2016-08-23 2 views
4

Я получаю NaN при расчете стандартного отклонения (stddev). Это очень простой случай использования, как описано ниже:Искры 1.5.2: NaN при вычислении stddev

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

Я в STDDEV определенный как UDF:

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

я получаю NaN, когда я называю UDF, как показано ниже:

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

Он производит следующее:

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

Что я делаю неправильно?

ответ

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

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