如何使用PySpark将不同表头的多个DataFrame保存到单个文件?
问题
需要将3个结构不同的DataFrame(df_1、df_2、df_3)保存到同一个csv/txt文件中,要求:
- 按df_1、df_2、df_3的顺序写入
- 文件以
|为分隔符,无表头
当前多次调用write方法的方式无法实现需求,尝试的代码如下:
df1.coalesce(1).write.format("csv").option("sep","|").option("header", "false").save(output_path) df2.coalesce(1).write.format("csv").option("sep","|").option("header", "false").save(output_path) df3.coalesce(1).write.format("csv").option("sep","|").option("header", "false").save(output_path)
三个DataFrame的结构及示例数据:
df_1结构
| id | FileDate | FileTime | FileType | File Action |
|---|---|---|---|---|
| 1 | 20230713 | 17:12:23 | ENS | Update |
df_2结构
| id | name | postal | provider |
|---|---|---|---|
| 1 | Jame | 12345 | ATT |
| 2 | Anne | 12145 | Verizon |
| 3 | John | 32145 | ATT |
| 4 | David | 14215 | Verizon |
df_3结构
| RecordType | TotalRecords |
|---|---|
| RC | 200 |
期望输出文件格式:
1|20230713|17:12:23|ENS|Update 1|Jame|12345|ATT 2|Anne|12145|Verizon 3|John|32145|ATT 4|David|14215|Verizon RC|200
解决方案
Spark的write操作会直接覆盖目标路径或生成多个独立文件,无法实现追加合并不同结构的DataFrame。正确做法是将每个DataFrame的所有列拼接成|分隔的单字符串列,再按顺序合并后统一写入。
步骤1:将每个DataFrame转换为单字符串列
使用concat_ws函数按列顺序拼接所有字段,生成唯一的value列:
from pyspark.sql.functions import concat_ws # 处理df1:拼接所有列成|分隔的字符串 df1_str = df1.select(concat_ws("|", *df1.columns).alias("value")) # 处理df2:同理拼接列 df2_str = df2.select(concat_ws("|", *df2.columns).alias("value")) # 处理df3:同理拼接列 df3_str = df3.select(concat_ws("|", *df3.columns).alias("value"))
步骤2:按顺序合并DataFrame
用union方法(Spark 2.x及以上可用)按df1→df2→df3的顺序合并:
combined_df = df1_str.union(df2_str).union(df3_str)
步骤3:写入文件
将合并后的DataFrame写入目标路径,关闭表头并指定格式:
combined_df.coalesce(1).write.format("csv") \ .option("sep", "|") \ .option("header", "false") \ .mode("overwrite") \ .save(output_path)
额外说明
concat_ws("|", *df1.columns)会严格按DataFrame的列顺序拼接字段,完全匹配需求格式coalesce(1)将数据合并到一个分区,确保生成单个输出文件(不需要单文件可去掉该方法)mode("overwrite")会覆盖目标路径原有文件,可根据需求改为append等模式
内容的提问来源于stack exchange,提问作者Duc Vu
相关产品推荐
相关产品推荐

