Лямбда rdd.map дает: TypeError: неподдерживаемые типы операндов для -: 'Row' и 'float'
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, взамен self.mapPartitions(лямбда-x: [sum(x)]). Fold(0, operator.add) Файл "", строка 7, в TypeError: неподдерживаемые типы операндов для -: 'Row' и 'float'
Я имею в виду поплавок. Значение, которое я ожидаю, что x будет float; но читается как строка, я думаю. Что, что я делаю не так? Благодарю.
2 ответа
Как вы выбираете results
колонка из df
ниже
temprdd = df.select('results').rdd
Ваше лямбда-выражение в map
должно быть что-то вроде 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)