spark.sql & pyspark.sql.functions

hyeok2·2024년 10월 9일

databricks

목록 보기
4/6
post-thumbnail

데이터 전처리

데이터 전처리를 하며, 단순히 sql 말고 pyspark.sql.functions를 이용하여 전처리를 하게 되었다.
물론 spark.sql(""" SELECT * FROM _____ WHERE •••• NOT IN('abc','def')""") 등과 같이 sql을 활용하여도 전처리가 가능했지만 각각 장단점이 존재하였기에 뭐든지 다 할줄 아는게 중요하지 않은가!
물론 여기서 선택하게된 이유는 일단 python을 활용한 전처리가 계속 들어갔기에, funtions를 활용한 전처리가 수월할 것이라는 판단에서 였다. (물론 더 나은 방법이 있을 수도 있으나 이는 앞으로 내가 계속 찾아보며 경험해보아야할 사항인 것 같다)
두번째로는 앞으로 이 코드를 사용할 현업(sales팀)이 어떤 코드가 유지관리하기 편한지 모르기에!

1. spark.sql & pyspark.sql.functions

두 방법의 장단점을 ai에게 질문을 해본 결과이다.

특징pyspark.sql.functionsspark.sql()
코드 스타일PythonicSQL
Type safety높음낮음
IDE 지원좋음제한적
코드 길이길 수 있음짧을 수 있음
복잡한 로직 구현UDF 활용 가능제한적
Spark Catalyst Optimizer활용 가능직접 활용
학습 곡선SQL에 익숙하지 않은 경우 높음SQL에 익숙한 경우 낮음

1.1 내가 생각한 선택기준

내 생각에는 선택을 할때 가장 중요한게 내가 SQL을 많이 써보았냐, 파이썬을 많이 사용하였느냐이다.
그리고 계속 사용하다보면 pyspark.sql.functions를 이용하는게 UDF를 활용한다던지 복잡한 로직을 구현하기 쉬울 것 같다는 느낌을 받았다.
하지만 일반적인 개발자들 입장에서는 spark환경을 경험할 기회가 적기 때문에 functions를 이용한 개발을 하려고 시도하기보다는 익숙한 sql 환경이 훨씬 나을 것 같다는 생각이 들었다.

1.2 pyspark.sql.functions중 무엇을 사용하였나?

조인할때도 사용하고, 조건문을 추가하여 전처리를 할때도 사용하였다.
이러다보니 import 하는 module도 계속 늘어나서 이를 확인하는게 복잡해지기도 하였다.
가장 많이 사용한 모듈들은 다음과 같다.
from pyspark.sql.functions import col, lower, when, lit
이를 사용하게 된건 전처리를 하다보니 다 필요하였기 때문이랄까?

1.3 pyspark.sql.functions에서 저것들을 왜 사용하였는가?

왜 저걸 사용하였느냐를 묻는다면 먼저 데이터 원천 소스 보면 답이 나온다.
나열해보자면 다음과 같다.

  • excel 데이터 원천(.xlsx)
  • 크롤링데이터
    →(원래는 웹에서 모두 다운받던 데이터라 80개가 넘는 파일을 조회하고 다운받아야하는 상황이었으며, 이를 크롤링으로 대체하여 10분으로 단축시켜주었다. 너무 시간 소요가 많아서 두달에 한번씩만 다운받던 데이터를 매달 들어오게 하였으니. 일년에 인건비만해도 한달에 150~240만원씩 절감해준거 아닐까)
  • 영업직들이 기입하는 데이터

excel 데이터 원천별로 대소문자가 다른경우도 있었으며, 소계 row가 추가되어있는 등 골아팠다.

  • 이를 처리하기 위해 lower을 이용하여 소문자를 만든 후 join을 하기도 하였으며,
  • when을 이용하여 조건절을 추가,
  • col을 이용하여 특정 컬럼을 선택하여 조건을 비교
    와 같은 작업들을 진행하였다.

2. pyspark.sql.functions 사용한 예시

예시를 본다면, 짧은걸 가져온다면?

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

profile
땅을 파다보면 흙과 물을 보겠지만, 코드를 파다보면 답이 보일것이다.

0개의 댓글