본문 바로가기

Computer Science/Bigdata(hdoop, spark, hive)

[PySpark] 연산자 우선순위 이슈 - 'py4j.Py4JException: Method or([class java.lang.Integer]) does not exist'

반응형

pyspark에서 and, or, not에 대해서 다음과 같은 이슈가 발생할 수 있다

py4j.Py4JException: Method or([class java.lang.***]) does not exist
py4j.Py4JException: Method and([class java.lang.***]) does not exist
py4j.Py4JException: Method not([class java.lang.***]) does not exist

 

내 경우에는 다음과 같이 or를 사용하면서 발생

# 잘못된 코드
.filter(col('row_num')== 2 | col('row_cnt') == 1)

 

에러로그

 

py4j.Py4JException: Method or([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:745)

 

아니 boolean끼리 or 하는데 왜 integer method 에러가 나는거지....??

이유는 중괄호를 넣지 않아서 연산자를 잘못 인식한 경우이다.

이렇게 작성해야 boolean간의 or 연산으로 인식한다.

# 정상적인 코드
.filter( (col('row_num')== 2) | (col('row_cnt') == 1) )

 

 

처음과 같이 잘못된 코드로 작성하면 연산자 우선순위에 의해서 다음과 같이 동작하는 것이다.

# 잘못된 코드
.filter( col('row_num')== (2 | col('row_cnt')) == 1 )

 

 

연산자 우선순위는 진짜 컴린이 시절에 배우는 것인데 이렇게 실무에서 어이없는 이슈가 생기는 경우가 있다.

기본기가 왜 중요한지를 또 깨닫은 하루.

반응형