rdd.map给出:TypeError:不支持的操作数类型 - :'Row'和'float'
我使用以下命令从数据框创建一个rdd:
temprdd = df.select('results').rdd
然后我想对其中的所有对象进行计算(基本上在我的'结果'列中,我现在认为它是自己的rdd):
sqrt(temprdd.map(lambda x : pow(x-mean,2)).sum())
但我得到了:
文件“/usr/local/src/spark20master/spark/python/pyspark/rdd.py”,行 999,in return self.mapPartitions(lambda x:[sum(x)])。fold(0,operator.add)File“”,第7行,in TypeError:不支持的操作数类型 - :'Row'和 '浮动'
我的意思是浮动。我期待x的值是浮点数;但我想是一行。哦,我做错了什么?谢谢。
答案 0 :(得分:0)
当您从results
下面选择df
列
temprdd = df.select('results').rdd
map
中的lambda表达式应该类似x.results
,而不仅仅是行类型x
temprdd.map(lambda x : pow(x.results - 7, 2))
答案 1 :(得分:0)
@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)