스파크 Spark

[Spark] PySpark에서 explode 함수로 array구조 분해하기

sseozytank 2024. 5. 10.

https://stackoverflow.com/questions/57811415/reading-a-nested-json-file-in-pyspark  <- 참고 자료 

 

pyspark json을 read 하다가, 구조가 너무 복잡하게 read 되어서 분리하는데 애를 좀 먹었다. array는 쉬운데 struct 구조가 넘 어려웠다..... 일단  array 구조 분해부터 explode로 해보자. 

from pyspark.sql import SparkSession


# 스파크 세션 생성
spark = SparkSession.builder \
    .appName("Transform DataFrame") \
    .getOrCreate()

from pyspark.sql import functions as F

data = [(['A', 'B'], "2020-11-01",),
 (['B', 'I', 'R'], "2020-11-01",),
 (['S', 'H'], "2020-11-02",),
 (['A', 'H', 'S'], "2020-11-02",), ]

df = spark.createDataFrame(data, ("list", "dates",))

 

json을 다루다보면 array 구조의 데이터 프레임을 자주 만날 수 있다.  df의 all_skills 컬럼이 array로 되어있는 것을 확인할 수 있다. 근데... 너무 불편하지 않은가!? explode로 펼쳐주자 

 

*explode 함수 

explode 함수는 주어진 배열 또는 맵의 각 요소에 대해 새 행을 반환하는 것임. df를 explode 하면 저렇게 펼쳐진다. 

df.select(explode('all_skills'),'dates').show()

 

 

단, explode를 사용하면 컬럼명이 col로 초기화되므로 alias를 사용해서 컬럼명을 지정해주는게 좋다. 

df.select(explode('all_skills').alias("all_skills"),'dates').show()

 

단, 한번에 두 컬럼을 explode하는건 불가능하다.하려하면, 아래와 같은 오류가 뜬다. 주의하기 ! 

AnalysisException: Only one generator allowed per select clause but found 2: explode(all_skills), explode(dates)

 

하고싶다면, 한 컬럼에 대해 explode 한 DataFrame을 새 변수에 저장하고, 그 변수에서 다시 explode 해주면 된다. 

댓글