在Python中使用rddv/SparkSQL计算Std偏差

在Python中使用rddv/SparkSQL计算Std偏差,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我对spark的世界相当陌生(从某种程度上说,甚至是Python,但更好)。我试图计算标准偏差,并使用了以下代码。第一个是使用SparkSQL,代码如下: sqlsd=spark.sql("SELECT STDDEV(temperature) as stdtemp from washing").first().stdtemp print(sqlsd) 我认为上面的方法很好,结果是6.070 现在,当我尝试使用RDD和以下代码执行此操作时:- def sdTemperature(df,

我对spark的世界相当陌生(从某种程度上说,甚至是Python,但更好)。我试图计算标准偏差,并使用了以下代码。第一个是使用SparkSQL,代码如下:

 sqlsd=spark.sql("SELECT STDDEV(temperature) as stdtemp from 
 washing").first().stdtemp
 print(sqlsd)
我认为上面的方法很好,结果是6.070

现在,当我尝试使用RDD和以下代码执行此操作时:-

 def sdTemperature(df,spark):
    n=float(df.count())
    m=meanTemperature(df,spark) 
    df=df.fillna({'_id':0,'_rev':0,'count':0,'flowrate':0,'fluidlevel':0,
   'frequency':0,'hardness':0,'speed':0,'temperature':0,'ts':0,'voltage':0})
    rddT=df.rdd.map(lambda r: r.temperature)
    c=rddT.count()
    s=rddT.map(lambda x: pow(x-m,2)).sum()
    print(n,c,s)
    sd=sqrt(s/c)
    return sd
当我运行上面的代码时,我得到了一个不同的结果。我得到的值是53.195

我做错了什么?。上面我所要做的就是计算spark数据框列温度的std偏差,并使用lambda


提前感谢您的帮助。

有两种类型的标准偏差-请参考:

类似问题-


蜂巢中的
stddev()
是指向
stddev\u samp()
的指针。
stddev_pop()
就是您要查找的内容(从代码的第二部分推断)。因此,您的sql查询应该是
选择stddev_pop(温度)作为洗涤中的stdtemp

,感谢Zero323给了我线索。我跳过了空值。修改后的代码如下:-

 df2=df.na.drop(subset=["temperature"])
 rddT=df2.rdd.map(lambda r: r.temperature)
 c=rddT.count()
 s=rddT.map(lambda x: pow(x-m,2)).sum()
 sd=math.sqrt(s/c)
 return(sd)

谢谢你的帮忙。但不幸的是,这没有起作用。在更改stdev tp stddev_pop的标准偏差时,仍然会给出相同的结果。跳过
null
并用
0
填充它们不是一回事。还有一个数值稳定性的问题。谢谢——我完全同意。