728x90
반응형
spark explode() 함수는 리스트 타입의 컬럼에서 각각의 element 를 하나의 row 로 펼쳐주는 기능을 한다.
explode() 함수의 사용 방법에 대해서는 다음과 같이 이전에 정리해두었다.
다만 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
반응형
'데이터 엔지니어링 > Spark' 카테고리의 다른 글
Pyspark Window function (0) | 2024.03.14 |
---|---|
Spark explode() 사용해서 List 로 된 컬럼을 행으로 분리하기 (0) | 2023.10.01 |
Spark User Defined Functions (UDFs) (0) | 2023.10.01 |
Spark multi process error in macOS (0) | 2023.09.27 |
Spark JDBC Data Source Option (0) | 2023.09.26 |