将Spark数据框中的数组列扩展为单个列

时间:2019-01-02 07:58:57

标签: scala apache-spark

如何展开数组列,以使数组中的每个元素成为数据框中的一列?

数据框包含一个数组列,并且数组的大小不固定。意思是,第一行中的数组列可以具有n个元素,第二行中的数组列可以具有m个元素。

我尝试了explode()函数,但是将数组分为行而不是列。

Input dataframe
+---+------------------------------------------+
|id |arr                                       |
+---+------------------------------------------+
|1  |[{cid = a, pid = 12}, {cid = b, pid = 13}]|
|2  |[{cid = c, pid = 12}]                     |
+---+------------------------------------------+

Expected dataframe
+---+--------------------------------------------------+
|id |arr_12_cid | arr_12_pid | arr_13_cid | arr_13_pid |
+---+--------------------------------------------------+
|1  |a          | 12         | b          | 13         |
|2  |c          | 12         | null       | null       |
+---+--------------------------------------------------+

1 个答案:

答案 0 :(得分:0)

您可以在单独的列中获取数组的大小,找到最大值,然后进行迭代

val dataDF = Seq((1, Array("a", "b", "c", "d")), (2, Array("a", "b"))).toDF("id", "data")
val z = dataDF.withColumn("data_length", functions.size($"data")).selectExpr("max(data_length)").head().getInt(0)
dataDF.select((0 until z).map(r => dataDF.col("data").getItem(r)): _*).show()