lambda rdd.map gives: TypeError: unsupported operand type(s) for -: 'Row' and 'float'

lambda rdd.map gives: TypeError: unsupported operand type(s) for -: 'Row' and 'float'

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

我使用数据帧创建一个 rdd:

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

然后我想对其中的所有对象进行计算(基本上在我的 'results' 列中,我现在认为它是它自己的 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 的值是一个浮点数;但我猜是作为一行阅读的。什么哦我做错了什么?谢谢。

您正在从下面的 df 中选择 results

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

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

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

@mrsrinivas 的回答很有帮助,我照做了。但是,它缺少让我感到困惑的一部分。 主要问题代码来自包含 null 值的结果。因此,对于包含结果列的 table,它的代码是 selected 使用以下代码:

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

结果将如下所示:

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

所以为了不select 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)