반응형
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 |
+-------+--------+
**/
반응형