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

如何在PySpark DataFrame中合并含列表值的两列

解决PySpark DataFrame列表列拼接问题

没问题,这个需求用PySpark内置的array_concat函数就能轻松实现,它专门用来拼接多个数组类型的列。下面给你完整的示例代码和说明:

步骤1:创建示例DataFrame

先模拟你描述的场景,创建包含两个列表列的DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import array_concat, coalesce, lit

# 初始化SparkSession
spark = SparkSession.builder.appName("ArrayConcatExample").getOrCreate()

# 创建测试数据
data = [
    (["A", "B"], ["C", "D"]),
    (["X"], ["Y", "Z"]),
    (None, ["1", "2"]),  # 模拟其中一列是null的情况
    (["P", "Q"], None)
]

df = spark.createDataFrame(data, schema=["col1", "col2"])
df.show(truncate=False)

运行后输出的初始DataFrame:

+--------+--------+
|col1    |col2    |
+--------+--------+
|[A, B]  |[C, D]  |
|[X]     |[Y, Z]  |
|null    |[1, 2]  |
|[P, Q]  |null    |
+--------+--------+

步骤2:使用array_concat拼接列表列

直接调用array_concat函数,传入要拼接的列名,就能生成新列:

# 拼接col1和col2,同时处理null值(将null转为空数组)
df_result = df.withColumn(
    "col3",
    array_concat(
        coalesce(df.col1, lit([])),  # 如果col1是null,用空数组替代
        coalesce(df.col2, lit([]))   # 如果col2是null,用空数组替代
    )
)

df_result.show(truncate=False)

最终输出结果:

+--------+--------+------------+
|col1    |col2    |col3        |
+--------+--------+------------+
|[A, B]  |[C, D]  |[A, B, C, D]|
|[X]     |[Y, Z]  |[X, Y, Z]   |
|null    |[1, 2]  |[1, 2]      |
|[P, Q]  |null    |[P, Q]      |
+--------+--------+------------+

关键说明

  • array_concat的要求:所有传入的列必须是数组类型,如果你的列原本不是数组,需要先通过array()函数转换。
  • 处理null值:如果某行的其中一列是null,直接用array_concat会导致整行的新列变成null,所以用coalesce把null替换成空数组[],这样拼接结果就不会丢失有效数据。
  • 拼接顺序:array_concat(col1, col2)会把col1的元素放在前面,col2的元素接在后面,和你要求的顺序完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:09