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

