#python #function #pyspark #types #action
Вопрос:
Я пытаюсь написать 2 функции для преобразования строковых данных в формате RDD в формат с плавающей точкой, а затем найти среднюю длину sepal для набора данных iris. Из 2 функций одна работает нормально, но 2-я выдает ошибку. Может кто-нибудь помочь мне понять, какую ошибку я здесь совершаю
is_float = lambda x: x.replace('.','',1).isdigit() and "." in x
def getSapellen(str2):
if isinstance(str2, float):
return str2
attlist=str2.split(",")
if is_float(attlist[0]):
return float(attlist[0])
else:
return 0.0
SepalLenAvg=irisRDD.reduce(lambda x,y: getSapellen(x) getSapellen(y))
/(irisRDD.count()-1)
print(SepalLenAvg)
Приведенный выше фрагмент кода работает. Я не могу понять ошибку в приведенной ниже части
def getSapellen2(str2):
if ( str2.find("Sepal") != -1):
return str2
attlist=str2.split(",")
if isinstance(attlist[0],str):
return float(attlist[0])
else:
return 0.0
SepalLenAvg=irisRDD.reduce(lambda x,y: getSapellen2(x) getSapellen2(y))
/(irisRDD.count()-1)
print(SepalLenAvg)
При запуске второго метода я получаю следующую ошибку
Ошибка типа: можно только объединить str (не «плавающий») в str
Ответ №1:
Эта ошибка означает, что вы пытаетесь сложить строку и поплавок — единственное место, где вы добавляете что-то в код, — это лямбда, применяемая ко всему irisRdd.
Это означает, что по крайней мере в одном случае вызов getSapellen2(x) getSapellen2(y)
приводит к тому, что str возвращается одним вызовом, а плавает другим.
если вы посмотрите на первый оператор if, то return str2
увидите — который возвращает строку, в то время как все остальные условия возвращают числа
Ответ №2:
Это означает, что это условие isinstance(str2, float)
getSapellen
никогда не выполняется, в то время как это условие str2.find("Sepal") != -1
из getSapellen2
выполняется по крайней мере один раз. Поэтому тип str2
определенно не float
является строковым, вы можете привести его к плавающему или сделать что-то другое и вместо этого вернуть значение с плавающей точкой.