【问题标题】:Expanding an array column in a Spark dataframe to individual columns将 Spark 数据框中的数组列扩展到单个列
【发布时间】:2019-01-10 20:21:32
【问题描述】:

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

数据框包含一个数组列,并且数组的大小不固定。意思是,第一行的数组列可以有 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       |
+---+--------------------------------------------------+

【问题讨论】:

  • 在并行模式下可能是不可能的。因为每一行都可以有一些其他行不存在的列,并且您不能在并行情况下更改架构。因此,合理的方法是从头到尾遍历整个行。
  • 可以完成,但非常复杂 - 新的一年

标签: scala apache-spark


【解决方案1】:

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

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多