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

如何将PySpark DataFrame中多列字符串拆分为多行?

PySpark拆分逗号分隔列并转为多行

要实现将逗号分隔的Country和City列按对应位置拆分成多行,可以通过数组拆分+数组配对+行展开的组合操作完成,具体步骤如下:

1. 导入必要的函数

from pyspark.sql import SparkSession
from pyspark.sql.functions import split, arrays_zip, explode, col

2. 创建测试DataFrame(模拟原始数据)

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

# 构造原始数据
data = [
    (1, "USA,Mexico", "California,Mexico City"),
    (2, "Germany,France,Sweden", "Munich,Paris,Stockholm")
]
df = spark.createDataFrame(data, ["ID", "Country", "City"])

3. 执行拆分转换

# 1. 将逗号分隔的字符串转为数组
df_with_arrays = df.withColumn("country_array", split(col("Country"), ",")) \
                   .withColumn("city_array", split(col("City"), ","))

# 2. 用arrays_zip将两个数组的对应元素配对,生成结构体数组
df_zipped = df_with_arrays.withColumn("zipped", arrays_zip("country_array", "city_array"))

# 3. 展开结构体数组为多行
df_exploded = df_zipped.withColumn("exploded", explode(col("zipped")))

# 4. 提取结构体中的元素,得到最终格式
final_df = df_exploded.select(
    col("ID"),
    col("exploded.country_array").alias("Country"),
    col("exploded.city_array").alias("City")
).drop("country_array", "city_array", "zipped", "exploded")

4. 查看结果

final_df.show(truncate=False)

输出结果与目标格式一致:

+---+--------+-------------+
|ID |Country |City         |
+---+--------+-------------+
|1  |USA     |California   |
|1  |Mexico  |Mexico City  |
|2  |Germany |Munich       |
|2  |France  |Paris        |
|2  |Sweden  |Stockholm    |
+---+--------+-------------+

关键逻辑说明

  • split(col, ","):将字符串按逗号分割成数组,确保Country和City的数组元素位置一一对应;
  • arrays_zip(arr1, arr2):把两个数组的同索引元素打包成结构体,避免拆分后Country和City的对应关系混乱;
  • explode(col):将数组类型的列展开为多行,每个数组元素对应一行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:42:39