#apache-spark #pyspark #apache-spark-sql
#apache-spark #pyspark #apache-spark-sql
Вопрос:
Может кто-нибудь помочь мне разобраться в приведенной ниже ошибке, я новичок в PySpark, начал учиться.
Когда я погуглил, возникает следующая ошибка: когда мы сравниваем разные типы типов данных, у меня был столбец с именем salary как целочисленный столбец? Почему я все еще получаю эту ошибку.
>>> df.printSchema()
root
|-- Firstname: string (nullable = true)
|-- middlename: string (nullable = true)
|-- lastname: string (nullable = true)
|-- dob: string (nullable = true)
|-- sex: string (nullable = true)
|-- salary: integer (nullable = true)
|-- CopiedColumn: integer (nullable = true)
|-- Country: string (nullable = false)
|-- anotherColumn: string (nullable = false)
>>> df.show()
--------- ---------- -------- ---------- --- ------ ------------ ------- -------------
|Firstname|middlename|lastname| dob|sex|salary|CopiedColumn|Country|anotherColumn|
--------- ---------- -------- ---------- --- ------ ------------ ------- -------------
| James| | Smith|1991-04-01| M|300000| -300000| India|Another value|
| Michael| Rose| |2000-05-19| M|400000| -400000| India|Another value|
| Robert| |Williams|1978-09-05| M|400000| -400000| India|Another value|
| Maria| Anne| Jones|1967-12-01| F|400000| -400000| India|Another value|
| Jen| Mary| Brown|1980-02-17| F| -100| 100| India|Another value|
--------- ---------- -------- ---------- --- ------ ------------ ------- -------------
>>> df.withColumn("lit_value2", when(col("salary") >=400000 amp; col("salary") <= 500000,lit("100")).otherwise(lit("200"))).show()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/mapr/spark/spark/python/pyspark/sql/column.py", line 115, in _
njc = getattr(self._jc, name)(jc)
File "/opt/mapr/spark/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
File "/opt/mapr/spark/spark/python/pyspark/sql/utils.py", line 63, in deco
return f(*a, **kw)
File "/opt/mapr/spark/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 332, in get_return_value
py4j.protocol.Py4JError: An error occurred while calling o138.and. Trace:
py4j.Py4JException: Method and([class java.lang.Integer]) does not exist
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
at py4j.Gateway.invoke(Gateway.java:274)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:238)
at java.lang.Thread.run(Thread.java:748)
Комментарии:
1. Это действительно сложная задача. Сообщение об ошибке довольно загадочное. слава вам
Ответ №1:
Вам нужно заключить условия в круглые скобки:
when((col("salary") >= 400000) amp; (col("salary") <= 500000), lit("100"))
В противном случае ваше условие будет интерпретироваться как показано ниже, из-за приоритета оператора — amp;
выше, чем >=
.
col("salary") >= (400000 amp; col("salary")) <= 500000
что не имеет смысла и выдает полученную вами ошибку.
Ответ №2:
Для потомков вы также можете получить аналогичную ошибку, если вы передаете не Column
объекты в выражении. Например:
column = 'A'
df.select(df[column] == 0) # this is fine
column = ['A'] # whoops, df[['A']] results in a DataFrame, not a Column
df.select(df[column] == 0) # py4j.Py4JException: Method col([class java.lang.Boolean]) does not exist