Почему моя функция pyspark2 выдает ошибку, а функция 1 работает нормально, логически они оба делают одно и то же ? может кто-нибудь помочь мне понять?

#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 является строковым, вы можете привести его к плавающему или сделать что-то другое и вместо этого вернуть значение с плавающей точкой.