Spark 1.5.2:计算标准差时出现NaN

4

在计算标准差(stddev)时,我得到了NaN。 如下所述,这是一个非常简单的用例:

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

我把标准差定义为一个UDF:

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

当我如下调用UDF时,会得到NaN

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

它会产生以下结果:
+------+
|stddev|
+------+
|   NaN|
+------+

我做错了什么?

1个回答

3

根据您的数据,无论是 mean(col*col) 还是 mean(col)*mean(col) 都将大于 Long 的最大值。您可以先将输入列转换为 double 类型:

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

但是通常情况下,它在非常大的数值上不会特别稳定。


Spark 1.6如何处理大量数据?在这种情况下,有更好的计算标准差的方法吗? - Neel
因为Double.MaxValue大约是1.79e308,而Long.MaxValue大约是9.2e18。 - zero323
是的,1.6版本中的内置函数具有更好的数值特性。 - zero323
“但一般来说,在非常大的数字上它不会特别稳定”这句话是什么意思? - Neel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接