2017-04-03 47 views
2

我对火花世界(甚至延伸Python甚至更好)都很陌生。我正在尝试计算标准偏差并使用了以下代码。第一次使用SparkSQL,代码如下:在Python中使用RDD v/s SparkSQL计算Std偏差

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

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

预先感谢帮助..

+0

跳过'nulls'并用'0'填充它们不是一回事。还有一个数值稳定性问题。 – zero323

+0

谢谢 - 我完全同意。 – sunny

回答

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

在蜂房stddev()是一个指向stddev_samp()stddev_pop()是你正在寻找的(从你的第二部分代码推断)。所以你的SQL查询应该是select stddev_pop(temperature) as stdtemp from washing

+0

感谢您的切入。但不幸的是,这并没有奏效。在改变标准偏差stdev tp stddev_pop仍然给出相同的结果。 – sunny

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)