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的值是一个浮点数;但是被读作我想的一排。什么哦,我做错了什么?谢谢。
答
正如你在下面
temprdd = df.select('results').rdd
在map
你的lambda表达式应该是选择从df
results
柱像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)
@mrsrinivas平均是先前设置的变量。我用一个硬编码的'7'对它进行了测试,然后得到:TypeError:不支持的操作数类型为 - :'Row'和'int'。所以我认为问题在于'x'没有像我期望的那样得到解决,也没有被解决。 '行'没有任何意义,它应该是一个数字。 – amadain