반응형
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 )
연산자 우선순위는 진짜 컴린이 시절에 배우는 것인데 이렇게 실무에서 어이없는 이슈가 생기는 경우가 있다.
기본기가 왜 중요한지를 또 깨닫은 하루.
반응형
'Computer Science > Bigdata(hdoop, spark, hive)' 카테고리의 다른 글
[Hadoop/Spark] MapReduce란 무엇인가?(Mapper, reducer) (0) | 2022.10.28 |
---|---|
[spark] YARN spark-submit deadlock (spark job 멈춤현상) (0) | 2020.05.07 |
[Spark/Scala] 스파크, 스칼라 버전확인 (0) | 2020.04.27 |