[spark] Row 분리하기

반응형

explode 함수를 이용해서 배열 타입을 여러 개의 row로 변환하는 것을 해보자.

val data = Seq(
  Row("James", List("Java", "Scala")),
  Row("Patrick", List("Java", "Scala", "Kotlin")),
  Row("Matt", List("Go", "")),
  Row("Adela", List("Go", "Python", "Ruby")),
  Row("Tim", null)
)


val arraySchema = new StructType()
  .add("user", StringType)
  .add("languages", ArrayType(StringType))


val df = spark.createDataFrame(
  spark.sparkContext.parallelize(data),
  arraySchema
)

df.printSchema()

/**

root
 |-- user: string (nullable = true)
 |-- languages: array (nullable = true)
 |    |-- element: string (containsNull = true)

**/


df.show(false)
/**
+-------+---------------------+
|user   |languages            |
+-------+---------------------+
|James  |[Java, Scala]        |
|Patrick|[Java, Scala, Kotlin]|
|Matt   |[Go, ]               |
|Adela  |[Go, Python, Ruby]   |
|Tim    |null                 |
+-------+---------------------+
**/

 

 

languages 배열을 explode 함수를 이용해서 여러 개의 row로 분리해보자 

df.select(col("user"), explode(col("languages")).alias("language"))
 	.show(false)

/**
+-------+--------+
|user   |language|
+-------+--------+
|James  |Java    |
|James  |Scala   |
|Patrick|Java    |
|Patrick|Scala   |
|Patrick|Kotlin  |
|Matt   |Go      |
|Matt   |        |
|Adela  |Go      |
|Adela  |Python  |
|Adela  |Ruby    |
+-------+--------+
**/

Row("Tim", null) 값이 사라지는 것을 확인할 수 있다.

 

 

 

null값만 있는 행도 포함해서 분리하려면 explode_outer 함수를 이용하면 된다.

df.select(col("user"), explode_outer(col("languages")).alias("language"))
    .show(false)

/**
+-------+--------+
|user   |language|
+-------+--------+
|James  |Java    |
|James  |Scala   |
|Patrick|Java    |
|Patrick|Scala   |
|Patrick|Kotlin  |
|Matt   |Go      |
|Matt   |        |
|Adela  |Go      |
|Adela  |Python  |
|Adela  |Ruby    |
|Tim    |null    |
+-------+--------+
**/