lambda 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(lambda x: [sum(x)]).fold(0, operator.add) Файл "", строка 7, в TypeError: неподдерживаемые типы операндов для -: "Row" и "float"

Я имею в виду поплавок. Значение, которое я ожидаю от x, будет числом с плавающей запятой; но читается как ряд, я думаю. Что о, что я делаю неправильно? Спасибо.


person amadain    schedule 27.02.2017    source источник
comment
@mrsrinivas Среднее значение - это переменная, установленная ранее. Я протестировал его с жестко запрограммированной «7», а затем получил: TypeError: неподдерживаемый тип (ы) операнда для -: «Row» и «int». Поэтому я думаю, что проблема в том, что «х» не решается, как я ожидаю, а не в среднем. «Строка» не имеет никакого смысла, она должна быть числовой.   -  person amadain    schedule 27.02.2017


Ответы (2)


Поскольку вы выбираете results столбец из df ниже

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

Ваше лямбда-выражение в map должно быть чем-то вроде x.results, а не только x типа Row.

temprdd.map(lambda x : pow(x.results - 7, 2))
person mrsrinivas    schedule 28.02.2017

Ответ от @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)
person aibrahim    schedule 27.10.2017