PySpark中如何像展开Struct一样展开Array?星号语法失效
解决PySpark嵌套数组结构展开问题
要处理这种包含数组的嵌套结构,你需要先炸开数组,再展开数组内的结构体,具体步骤如下:
1. 展开外层结构体
你之前的这一步是正确的,先提取content结构体里的所有字段:
from pyspark.sql import functions as F df1 = df0.select(F.col('content.*'))
2. 炸开data数组
因为data是数组类型,不能直接用.*展开,必须先用explode函数将数组的每个元素拆分为单独的行:
df_exploded = df1.withColumn("data_element", F.explode(F.col("data")))
这一步会把每个data数组里的结构体元素单独拆出来,生成新的data_element字段(类型为结构体)。
3. 展开数组内的结构体
现在data_element是单个结构体,就可以用.*展开它的字段了:
df_final = df_exploded.select("importantId", "data_element.*")
最终结果
执行完以上步骤后,df_final的结构就会和你期望的一致:
| importantId | importantCol0 | importantCol1 |
|---|---|---|
| 10800005 | 0397AZ | 0397AZ |
| 10800006 | 0397BZ | 0397BZ |
报错原因说明
你之前直接用F.col('data.*')会报错,是因为data是数组类型,而.*语法仅支持展开结构体类型的字段。必须先通过explode把数组转换为单个结构体元素,才能使用.*展开内部字段。
内容的提问来源于stack exchange,提问作者noniguez
相关产品推荐
相关产品推荐

