Spark:分解结构的数据帧数组并附加id

Ste*_*eve 8 scala apache-spark spark-dataframe

我目前有一个带有id和列的数据帧,这是一个结构数组:

 root
 |-- id: integer (nullable = true)
 |-- lists: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- text: string (nullable = true)
 |    |    |-- amount: double (nullable = true)
Run Code Online (Sandbox Code Playgroud)

这是一个包含数据的示例表:

 id | lists
 -----------
 1  | [[a, 1.0], [b, 2.0]]
 2  | [[c, 3.0]]
Run Code Online (Sandbox Code Playgroud)

如何将上述数据帧转换为下面的数据帧?我需要"爆炸"数组并同时附加id.

 id | col1  | col2
 -----------------
 1  | a     | 1.0
 1  | b     | 2.0
 2  | c     | 3.0
Run Code Online (Sandbox Code Playgroud)

编辑说明:

请注意,以下两个示例之间存在差异.第一个包含"一系列元素结构".而后者只包含"一系列元素".

 root
 |-- id: integer (nullable = true)
 |-- lists: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- text: string (nullable = true)
 |    |    |-- amount: double (nullable = true)


root
 |-- a: long (nullable = true)
 |-- b: array (nullable = true)
 |    |-- element: long (containsNull = true)
Run Code Online (Sandbox Code Playgroud)

小智 17

explode 正是这个功能:

import org.apache.spark.sql.functions._

df.select($"id", explode($"lists")).select($"id", $"col.text", $"col.amount")
Run Code Online (Sandbox Code Playgroud)