如何在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
相关产品推荐
相关产品推荐

