Лямбда 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)
Другие вопросы по тегам