
데이터 전처리를 하며, 단순히 sql 말고 pyspark.sql.functions를 이용하여 전처리를 하게 되었다.
물론 spark.sql(""" SELECT * FROM _____ WHERE •••• NOT IN('abc','def')""") 등과 같이 sql을 활용하여도 전처리가 가능했지만 각각 장단점이 존재하였기에 뭐든지 다 할줄 아는게 중요하지 않은가!
물론 여기서 선택하게된 이유는 일단 python을 활용한 전처리가 계속 들어갔기에, funtions를 활용한 전처리가 수월할 것이라는 판단에서 였다. (물론 더 나은 방법이 있을 수도 있으나 이는 앞으로 내가 계속 찾아보며 경험해보아야할 사항인 것 같다)
두번째로는 앞으로 이 코드를 사용할 현업(sales팀)이 어떤 코드가 유지관리하기 편한지 모르기에!
두 방법의 장단점을 ai에게 질문을 해본 결과이다.
| 특징 | pyspark.sql.functions | spark.sql() |
|---|---|---|
| 코드 스타일 | Pythonic | SQL |
| Type safety | 높음 | 낮음 |
| IDE 지원 | 좋음 | 제한적 |
| 코드 길이 | 길 수 있음 | 짧을 수 있음 |
| 복잡한 로직 구현 | UDF 활용 가능 | 제한적 |
| Spark Catalyst Optimizer | 활용 가능 | 직접 활용 |
| 학습 곡선 | SQL에 익숙하지 않은 경우 높음 | SQL에 익숙한 경우 낮음 |
내 생각에는 선택을 할때 가장 중요한게 내가 SQL을 많이 써보았냐, 파이썬을 많이 사용하였느냐이다.
그리고 계속 사용하다보면 pyspark.sql.functions를 이용하는게 UDF를 활용한다던지 복잡한 로직을 구현하기 쉬울 것 같다는 느낌을 받았다.
하지만 일반적인 개발자들 입장에서는 spark환경을 경험할 기회가 적기 때문에 functions를 이용한 개발을 하려고 시도하기보다는 익숙한 sql 환경이 훨씬 나을 것 같다는 생각이 들었다.
조인할때도 사용하고, 조건문을 추가하여 전처리를 할때도 사용하였다.
이러다보니 import 하는 module도 계속 늘어나서 이를 확인하는게 복잡해지기도 하였다.
가장 많이 사용한 모듈들은 다음과 같다.
from pyspark.sql.functions import col, lower, when, lit
이를 사용하게 된건 전처리를 하다보니 다 필요하였기 때문이랄까?
왜 저걸 사용하였느냐를 묻는다면 먼저 데이터 원천 소스 보면 답이 나온다.
나열해보자면 다음과 같다.
excel 데이터 원천별로 대소문자가 다른경우도 있었으며, 소계 row가 추가되어있는 등 골아팠다.
예시를 본다면, 짧은걸 가져온다면?
from pyspark.sql.functions import col, lower, when
df_final = spark_df.withColumn(
"Measure",
when(
lower(col("TEAM")).isin(["redbird", "bluetiger", "greenpanda"]),
when(col("territory") == "Seoul", "Metropolitan").otherwise(col("NonMetropolitan"))
).otherwise(
when(col("TEAM") == "_______", "_______").otherwise(col("______"))
)
)
이런식으로 처리했었다.
일단 functions가 너무 많기에 필요할때마다 어떤 방법이 있을지 고민하고 해당하는 functions를 찾아 사용하는 게 답일 것 같다.
조금 더 공부를 해야할 것 같다...
functions 공부
https://learn.microsoft.com/ko-kr/dotnet/api/microsoft.spark.sql.functions?view=spark-dotnet
https://spark.apache.org/docs/latest/sql-ref-functions.html