2017-04-03 2 views
2

私はsparkの世界にはかなり新しい(そしてPythonでも拡張しているが、より良い)。標準偏差を計算しようとしていて、次のコードを使用しました。次のようにSparkSQLとコードを使用して、最初は次のとおりです。RDD v/sを使った標準偏差の計算PythonのSparkSQL

sqlsd=spark.sql("SELECT STDDEV(temperature) as stdtemp from 
washing").first().stdtemp 
print(sqlsd) 

上記正常に動作します(と思う)、私は次のコードを使用してこれRDDを実行しようとするとき、それは今6.070

として結果を提供します -

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です

私は間違って何をしていますか?私が上でやろうとしているのは、スパークデータフレームのカラム温度の標準偏差を計算し、ラムダを使うことです。助けを事前に

感謝..

+0

'nulls'をスキップし、それらを' 0'で埋めることは同じことではありません。数値安定性の問題もある。 – zero323

+0

ありがとう - 私は完全に同意します。 – sunny

答えて

0

あり、標準偏差の2種類があります - これを参照してください。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()はあなたが探しているものです(コードの2番目の部分から推測されます)。だからあなたのSQLクエリはselect stddev_pop(temperature) as stdtemp from washing

+0

あなたのおかげでありがとうございます。しかし、残念ながらそれはうまくいきませんでした。 stdvからstdの偏差を変更するとstddev_popは同じ結果を返します。 – sunny

1

私に手がかりを与えたZero323のおかげです。私はnull値をスキップしました。変更されたコードは次の通りです: -

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) 
関連する問題