2017-04-03 40 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)