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

时间:2017-02-27 10:55:20

标签: lambda pyspark rdd data-science-experience

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的值是浮点数;但我想是一行。哦,我做错了什么?谢谢。

2 个答案:

答案 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)