我对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。
在此先感谢您的帮助..
最佳答案
感谢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)