1

rdd.map 给出: TypeError: unsupported operand type(s) for -: 'Row' and '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 行,返回 self.mapPartitions(lambda x: [sum(x)]).fold(0, operator.add)文件“”,第 7 行,类型错误:不支持的操作数类型 -: 'Row' 和 'float'

我的意思是浮动。我期望 x 的值是浮点数;但我猜是读作 Row 。哦,我做错了什么?谢谢。

4

2 回答 2

0

当您从下面选择results列时df

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

您的 lambda 表达式map应该类似于x.results而不是仅xRow 类型

temprdd.map(lambda x : pow(x.results - 7, 2))
于 2017-02-28T09:30:48.107 回答
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)
于 2017-10-27T23:02:31.500 回答