如何在PySpark DataFrame中将两列合并为行
PySpark合并多列为单列的解决方案
输入与期望输出
输入DataFrame
| Id | Time Interval 1 | Time Interval 2 |
|---|---|---|
| 1 | 4w | 24d |
| 1 | 8w | 12d |
期望输出DataFrame
| Id | Time Interval |
|---|---|
| 1 | 4w |
| 1 | 8w |
| 1 | 12d |
| 1 | 24d |
解决方案
方法1:使用stack函数(推荐,高效简洁)
stack函数可直接将多列转换为多行,适合批量合并列的场景:
from pyspark.sql import SparkSession from pyspark.sql.functions import expr # 初始化SparkSession(未初始化时执行) spark = SparkSession.builder.appName("CombineTimeIntervals").getOrCreate() # 构造输入DataFrame data = [(1, "4w", "24d"), (1, "8w", "12d")] df = spark.createDataFrame(data, ["Id", "Time Interval 1", "Time Interval 2"]) # 合并列 result_df = df.select( "Id", expr("stack(2, 'Time Interval 1', `Time Interval 1`, 'Time Interval 2', `Time Interval 2`) as (original_col, `Time Interval`)") ).drop("original_col") # 查看结果 result_df.show()
代码说明:
stack(2, ...)中的2代表要合并的列数量;- 每一组
'列名', 列值对应原DataFrame中的一列; - 通过
drop("original_col")移除不需要的原列名字段。
方法2:使用union合并子DataFrame
列数较少时,可分别提取列后用union合并:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("CombineTimeIntervals").getOrCreate() data = [(1, "4w", "24d"), (1, "8w", "12d")] df = spark.createDataFrame(data, ["Id", "Time Interval 1", "Time Interval 2"]) # 分别提取两列并重命名 df_interval1 = df.select("Id", df["Time Interval 1"].alias("Time Interval")) df_interval2 = df.select("Id", df["Time Interval 2"].alias("Time Interval")) # 合并两个DataFrame result_df = df_interval1.union(df_interval2) result_df.show()
内容的提问来源于stack exchange,提问作者Jie Zhang
相关产品推荐
相关产品推荐

