Spark嵌套复杂数据框

Posted

技术标签:

【中文标题】Spark嵌套复杂数据框【英文标题】:Spark nested complex dataframe 【发布时间】:2021-03-02 05:52:38 【问题描述】:

我正在尝试将复杂数据转换为正常的数据帧格式

我的数据架构:

root
 |-- column_names: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- values: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)
 |-- id: array (nullable = true)
 |    |-- element: string (containsNull = true)

我的数据文件(JSON 格式):

"column_names":["2_col_name","3_col_name"],"id":["a","b","c","d","e"],"values":[["2_col_1",1],["2_col_2",2],["2_col_3",9],["2_col_4",10],["2_col_5",11]]

我正在尝试将以上数据转换成这种格式:

+----------+----------+----------+
|1_col_name|2_col_name|3_col_name|
+----------+----------+----------+
|         a|   2_col_1|         1|
|         b|   2_col_2|         2|
|         c|   2_col_3|         9|
|         d|   2_col_4|        10|
|         e|   2_col_5|        11|
+----------+----------+----------+

我尝试对 id 和 values 使用explode 函数,但得到不同的输出,如下所示:

+---+-------------+
| id|       values|
+---+-------------+
|  a| [2_col_1, 1]|
|  a| [2_col_2, 2]|
|  a| [2_col_3, 9]|
|  a|[2_col_4, 10]|
|  a|[2_col_5, 11]|
|  b| [2_col_1, 1]|
|  b| [2_col_2, 2]|
|  b| [2_col_3, 9]|
|  b|[2_col_4, 10]|
+---+-------------+
only showing top 9 rows

不知道哪里做错了

【问题讨论】:

【参考方案1】:

您可以使用array_zip + inline 函数来展平然后旋转列名:

val df1 = df.select(
    $"column_names",
    expr("inline(arrays_zip(id, values))")
  ).select(
    $"id".as("1_col_name"),
    expr("inline(arrays_zip(column_names, values))")
  )
  .groupBy("1_col_name")
  .pivot("column_names")
  .agg(first("values"))

df1.show
//+----------+----------+----------+
//|1_col_name|2_col_name|3_col_name|
//+----------+----------+----------+
//|e         |2_col_5   |11        |
//|d         |2_col_4   |10        |
//|c         |2_col_3   |9         |
//|b         |2_col_2   |2         |
//|a         |2_col_1   |1         |
//+----------+----------+----------+

【讨论】:

以上是关于Spark嵌套复杂数据框的主要内容,如果未能解决你的问题,请参考以下文章

Spark Scala,如何检查数据框中是不是存在嵌套列

Spark:如何解析嵌套列表的 JSON 字符串以触发数据框?

在 Spark 数据框中爆炸嵌套结构

如何在 Spark 数据框中使用嵌套列进行连接

Scala Spark - 从简单的数据框创建嵌套的 json 输出

使用 spark-xml 从 pyspark 数据框中选择嵌套列