2017-02-27 3 views
1

rdd.mapは以下を与えます:TypeError: 'Row'と 'float'ラムダrdd.mapは次のようになります:TypeError: - 'Row'と 'float'のためのサポートされていないオペランドタイプ

私が使用してデータフレームからRDDを作成します。その後、私は(基本的に私は今、独自のRDDだと思う私の「結果」欄に)その内のすべてのオブジェクト上の計算をしたい

temprdd = df.select('results').rdd 

を:

sqrt(temprdd.map(lambda x : pow(x-mean,2)).sum()) 

しかし、私は得る:

File "/usr/local/src/spark20master/spark/python/pyspark/rdd.py", line 999, in return self.mapPartitions(lambda x: [sum(x)]).fold(0, operator.add) File "", line 7, in TypeError: unsupported operand type(s) for -: 'Row' and 'float'

私の平均はフロートです。私が期待している値はfloatです。私は推測する行として読み取られます。私は間違って何をしていますか?ありがとう。

+0

は、以前設定された変数です。私はそれをハードコードされた '7'でテストし、次に取得します:TypeError: - 'Row'と 'int'のためのサポートされないオペランドタイプ。だから私は問題は、 'x'は私が期待しているのではなく、平均で解決されていないと思う。 '行'は意味をなさない、数値でなければならない。 – amadain

答えて

0

あなたは

temprdd = df.select('results').rdd 

の下dfからresults列を選択しているとmapであなたのラムダ式ではなく、唯一のx行タイプの

temprdd.map(lambda x : pow(x.results - 7, 2)) 
0

x.resultsのようなものでなければなりません@mrsrinivasからの答えがあります役に立つと私はそれに従います。しかしそれは私を混乱させた1つの部分を欠いている。 主な問題コードは、nullの値を含む結果に由来します。だから、コラム、それのコードは次のコードを使用して選択することが結果が含まれる表について:結果は次のようになります

tempDF = df.select(df.results.cast('float').alias('results')) 
tempDF.show(5) 

を:だからnull値を選択しないように

+-------+ 
|results| 
+-------+ 
| null| 
| 95.0| 
| 93.0| 
| null| 
| 87.0| 
+-------+ 

、あなたがする必要があります次のコードを使用します。

tempDF_NoNull = tempDF.na.drop() 
tempDF_NoNull.show(5) 

をし、その結果は次のようになります。

+-------+ 
|results| 
+-------+ 
| 95.0| 
| 93.0| 
| 87.0| 
| 96.0| 
| 82.0| 
+-------+ 

結果列の標準偏差を計算し、それは以下のように計算することができる:平均@mrsrinivas

std = sqrt(tempRDD.map(lambda x : pow(x.results-mean, 2)).sum()/count) 
関連する問題