lambda rdd.map给出:TypeError:不支持的操作数类型为 - :'Row'和'float'

问题描述:

rdd.map给出:TypeError:不支持的操作数类型为 - :'Row'和'float'lambda rdd.map给出:TypeError:不支持的操作数类型为 - :'Row'和'float'

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

然后,我想要做的所有在它的对象计算(基本上在我的“结果”栏,我觉得现在是自己的RDD):

我使用创建一个数据帧的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'

我的意思是浮子。我期望x的值是一个浮点数;但是被读作我想的一排。什么哦,我做错了什么?谢谢。

+0

@mrsrinivas平均是先前设置的变量。我用一个硬编码的'7'对它进行了测试,然后得到:TypeError:不支持的操作数类型为 - :'Row'和'int'。所以我认为问题在于'x'没有像我期望的那样得到解决,也没有被解决。 '行'没有任何意义,它应该是一个数字。 – amadain

正如你在下面

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

map你的lambda表达式应该是选择从dfresults柱像x.results而不是仅仅排式x

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

从@mrsrinivas答案有帮助,我遵循它。但是它缺少一个让我困惑的部分。 主要问题代码来自包含null值的结果。因此,对于包括结果列其代码中使用下面的代码中选择一个表:

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

结果将类似于:

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

所以不选择null值,则需要使用下面的代码:

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

而结果将是:

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

我们计算的结果列的标准差,它可以计算如下:

std = sqrt(tempRDD.map(lambda x : pow(x.results-mean, 2)).sum()/count)