使用Python中的RDD v / s SparkSQL计算Std偏差

时间:2017-04-03 02:10:07

标签: 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):
    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

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

事先感谢您的帮助..

2 个答案:

答案 0 :(得分:1)

感谢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)

答案 1 :(得分:0)

有两种类型的标准偏差 - 请参阅:https://math.stackexchange.com/questions/15098/sample-standard-deviation-vs-population-standard-deviation

类似的问题 - Calculate the standard deviation of grouped data in a Spark DataFrame

Hive中的stddev()是指向stddev_samp()的指针。 stddev_pop()正是您所寻找的(从您的代码的第二部分推断)。所以你的sql查询应该是select stddev_pop(temperature) as stdtemp from washing