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:如何解析嵌套列表的 JSON 字符串以触发数据框?