Исключение PySpark ИЛИ метода

#pyspark

#pyspark

Вопрос:

Я пытаюсь изменить значение столбца в PySpark dataframe следующим образом:

 df_cleaned = df_cleaned.withColumn('brand_c', when(df_cleaned['brand'] == "samsung" |
                                                   df_cleaned['brand'] == "oppo", df_cleaned.brand)
                                   .otherwise('others'))
  

Это генерирует следующее исключение:

Произошла ошибка при вызове o435.или. Трассировка: py4j.Py4JException: Метод или([класс java.lang.Строка]) не существует в py4j.reflection.ReflectionEngine.GetMethod(ReflectionEngine.java:318) в py4j.reflection.ReflectionEngine.GetMethod(ReflectionEngine.java:326) в py4j.Gateway.invoke(Gateway.java:274) в py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) в py4j.commands.CallCommand.execute(CallCommand.java:79) в py4j.GatewayConnection.run(GatewayConnection.java:238) на java.lang.Thread.run(Thread.java:748)

Трассировка (последний последний вызов): Файл «/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/column.py «, строка 115, в файле _ njc = getattr(self._jc, name)(jc) «/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py «, строка 1257, в ответе на вызов, self.gateway_client, self.target_id, self.name ) Файл «/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py «, строка 63, в deco возвращает файл f(*a, **kw) «/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py «, строка 332, в формате get_return_value(target_id, «.», имя, значение)) py4j.protocol.Py4JError: произошла ошибка при вызове o435.или. Трассировка: py4j.Py4JException: Метод или([класс java.lang.Строка]) не существует в py4j.reflection.ReflectionEngine.GetMethod(ReflectionEngine.java:318) в py4j.reflection.ReflectionEngine.GetMethod(ReflectionEngine.java:326) в py4j.Gateway.invoke(Gateway.java:274) в py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) в py4j.commands.CallCommand.execute(CallCommand.java:79) в py4j.GatewayConnection.run(GatewayConnection.java:238) на java.lang.Thread.run(Thread.java:748)

Ответ №1:

Вам просто не хватает пары скобок. Попробуйте:

 df_cleaned = df.withColumn('brand_c', when((df['Product'] == "apple") |
                (df['Product'] == "oppo"), df.User).otherwise('others'))
  

Всегда используйте круглые скобки при использовании операторов сравнения в pyspark.