728x90
반응형

spark explode() 함수는 리스트 타입의 컬럼에서 각각의 element 를 하나의 row 로 펼쳐주는 기능을 한다.

 

explode() 함수의 사용 방법에 대해서는 다음과 같이 이전에 정리해두었다.

https://jaynamm.tistory.com/entry/Spark-explode-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-List-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EB%A6%AC%ED%95%98%EA%B8%B0

 

Spark explode() 사용해서 List 로 된 컬럼을 행으로 분리하기

Spark Dataframe 에 다음과 같이 리스트 형태로 들어간 컬럼이 있을 것이다. scala> val df = Seq(("Nam", List("A", "B", "C", "D"))).toDF("name", "grade") df: org.apache.spark.sql.DataFrame = [name: string, grade: array] scala> df.show() +

jaynamm.tistory.com

 

 

다만 explode() 함수를 사용할 때 주의할 점이 있어서 정리해보려고 한다.

 

아래와 같이 DataFrame 이 있다고 해보자.

scala> val df = Seq(("Nam", List("A", "B", "C", "", "E", "")), ("J", List())).toDF("name", "grade")
df: org.apache.spark.sql.DataFrame = [name: string, grade: array<string>]

scala> df.show()
+----+----------------+
|name|           grade|
+----+----------------+
| Nam|[A, B, C, , E, ]|
|   J|              []|
+----+----------------+

 

name 의 값이 J 인 row 에서 grade 컬럼이 빈 배열로 되어있다.
이 상태로 explode() 함수를 사용해서 grade 라는 컬럼을 각 row 의 값으로 펼쳐보려고 한다.

scala> val explode_df = df.withColumn("score", explode(col("grade")))
explode_df: org.apache.spark.sql.DataFrame = [name: string, grade: array<string> ... 1 more field]

 

결과를 확인해보면 다음과 같다.

scala> explode_df.show()
+----+----------------+-----+
|name|           grade|score|
+----+----------------+-----+
| Nam|[A, B, C, , E, ]|    A|
| Nam|[A, B, C, , E, ]|    B|
| Nam|[A, B, C, , E, ]|    C|
| Nam|[A, B, C, , E, ]|     |
| Nam|[A, B, C, , E, ]|    E|
| Nam|[A, B, C, , E, ]|     |
+----+----------------+-----+

 

name 이 J 인 데이터가 사라진 것을 확인할 수 있었다.
왜 그런지 이유를 확인해보니 explode() 함수는 배열 형태로 되어있는 값을 분리해서 펼쳐주는 기능을 한다.
하지만 배열 안에 원소가 없기 때문에 아무런 작업이 수행되지 않는다.
쉽게 말해서 배열 내 원소가 있는 경우에만 explode() 함수의 기능이 동작하면서 row 를 만들게 된다.

 

 

정리해보면 spark 에서 explode() 함수를 사용해서 배열 형태의 컬럼에서 배열의 원소를 각 행으로 만들 때
컬럼의 값이 빈 배열이라면 아무런 동작을 하지 않는다는 것이다.

 

따라서 spark explode() 함수를 사용할 때에는 해당 컬럼이 빈 배열을 가지고 있는 지 확인한 후에 사용해야한다.
그렇지 않다면 빈 배열을 처리해주는 기능을 추가해 주어야 한다.

728x90
반응형
복사했습니다!