You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中提取数组列元素并拆分存入新DataFrame

PySpark嵌套数组列拆分实现方案

常见报错原因

PySpark数组下标从0开始计数,你需要提取的第4个元素对应下标为3,若之前调用getItem(4)会取到空值,导致逻辑不符合预期。

固定长度子数组拆分代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import col

# 构造测试数据,实际使用时替换为自己的DataFrame即可
spark = SparkSession.builder.appName("array_split").getOrCreate()
test_data = [
    ([1,5,[],[2,3,22,42,3,-5]],),
    ([1,5,[],[-3,67,32,2,2.14,5]],),
    ([1,5,[],[32,1,3,34,6.7,90]],)
]
df = spark.createDataFrame(test_data, ["column_x"])

# 提取第4个元素(下标3)得到子数组
sub_array = col("column_x").getItem(3)

# 拆分生成新列
result_df = df.select(
    sub_array.getItem(0).alias("column1"),
    sub_array.getItem(1).alias("column2"),
    sub_array.getItem(2).alias("column3"),
    sub_array.getItem(3).alias("column4"),
    sub_array.getItem(4).alias("column5"),
    sub_array.getItem(5).alias("column6")
)

# 验证输出
result_df.show()

运行后输出结果与预期一致:

+-------+-------+-------+-------+-------+-------+
|column1|column2|column3|column4|column5|column6|
+-------+-------+-------+-------+-------+-------+
|      2|      3|     22|     42|      3|     -5|
|     -3|     67|     32|      2|   2.14|      5|
|     32|      1|      3|     34|    6.7|     90|
+-------+-------+-------+-------+-------+-------+

动态拆分方案(适配子数组长度不固定场景)

如果子数组元素较多或长度不固定,可批量生成选择列,无需手动编写:

# 计算子数组最大长度,也可直接指定固定长度
max_sub_len = df.selectExpr("max(size(column_x[3]))").first()[0]
select_cols = [sub_array.getItem(i).alias(f"column{i+1}") for i in range(max_sub_len)]
result_df = df.select(*select_cols)

内容的提问来源于stack exchange,提问作者Outlier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:54:04