如何在PySpark中将多列转换为多行(列转行操作)
PySpark实现多列转多行(拆分为两组同结构行)
你可以用以下两种简单的方法实现需求:
方法1:直接拆分合并(Union方式)
这种方式直观易懂,适合固定分组的场景:
from pyspark.sql import SparkSession from pyspark.sql.functions import col spark = SparkSession.builder.appName("cols_to_rows").getOrCreate() # 读取你的CSV文件(示例用构造数据代替) # df = spark.read.csv("your_file_path", sep="|", header=False, inferSchema=True) data = [(1, "name1", "add1", "pr1", "type1", 2, "name2", "add2", "pr2", "type2")] df = spark.createDataFrame(data, ["c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9"]) # 提取第一组列 df_group1 = df.select("c0", "c1", "c2", "c3", "c4") # 提取第二组列并重命名为目标列名 df_group2 = df.select( col("c5").alias("c0"), col("c6").alias("c1"), col("c7").alias("c2"), col("c8").alias("c3"), col("c9").alias("c4") ) # 合并两组数据 result_df = df_group1.union(df_group2) result_df.show()
输出结果:
+---+-----+----+---+-----+ |c0 |c1 |c2 |c3 |c4 | +---+-----+----+---+-----+ |1 |name1|add1|pr1|type1| |2 |name2|add2|pr2|type2| +---+-----+----+---+-----+
方法2:数组炸开(Array+Explode方式)
这种方式更灵活,适合需要拆分更多组的场景(比如20列拆成4行),不需要重复写多次select:
from pyspark.sql import SparkSession from pyspark.sql.functions import array, explode, struct spark = SparkSession.builder.appName("cols_to_rows").getOrCreate() data = [(1, "name1", "add1", "pr1", "type1", 2, "name2", "add2", "pr2", "type2")] df = spark.createDataFrame(data, ["c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9"]) # 将两组列分别打包成结构体,放到数组中,再炸开数组得到多行 result_df = df.select( explode( array( struct("c0", "c1", "c2", "c3", "c4"), struct(col("c5").alias("c0"), col("c6").alias("c1"), col("c7").alias("c2"), col("c8").alias("c3"), col("c9").alias("c4")) ) ).alias("row_data") ).select("row_data.*") result_df.show()
核心逻辑是用struct把每组列打包成结构体,用array组合多个结构体,再通过explode将数组拆成多行,最后展开结构体字段即可。
内容的提问来源于stack exchange,提问作者Sunag
相关产品推荐
相关产品推荐

