如何在PySpark中将DataFrame保存为GZ格式文本文件(非CSV)
解决方案
针对你的需求,我分两种常用的场景来给出具体实现方法,分别是Pandas和PySpark,你可以根据自己的使用场景选择:
一、使用Pandas处理
如果你的DataFrame是Pandas对象,由于Pandas默认生成单个文件,要生成多个part-xxxxxx.gz格式的文件,需要手动分片后逐个保存:
- 先确定分片数量(比如按行数均分,或者你指定分片数)
- 遍历每个分片,按指定格式保存
示例代码:
import pandas as pd import numpy as np # 假设你的DataFrame是df # 定义分片数量,比如分成2个part num_parts = 2 # 将DataFrame拆分为多个子块 chunks = np.array_split(df, num_parts) # 遍历子块,保存为对应命名的gz文件 for i, chunk in enumerate(chunks): # 格式化文件名,生成part-00000.gz、part-00001.gz这类格式 filename = f"part-{i:05d}.gz" # 保存文件,指定分隔符|、gzip压缩,不保留索引和表头(和你提供的示例格式匹配) chunk.to_csv( filename, sep='|', compression='gzip', index=False, header=False )
说明:
np.array_split会把DataFrame均分成指定数量的块,如果总行数无法整除,最后一块的行数会略少- 如果输出需要表头,把
header=False改成header=True即可 - 通过
compression='gzip'指定压缩格式,Pandas会自动生成.gz后缀的文件
二、使用PySpark处理
如果你的DataFrame是PySpark对象,这个场景会更简单——Spark本身支持分布式输出多part文件,直接调用write方法就能实现需求:
示例代码:
from pyspark.sql import SparkSession # 假设你已经初始化了SparkSession,且拥有目标DataFrame df df.write \ .format("csv") \ .option("sep", "|") \ .option("compression", "gzip") \ .mode("overwrite") # 可选模式:overwrite覆盖、append追加、ignore忽略已存在 .save("./output_dir")
说明:
- 执行后,Spark会在
./output_dir目录下生成part-00000.gz、part-00001.gz等文件,文件数量取决于你的Spark分区数 - 如果需要指定生成的part数量,可以先对DataFrame重分区:
df.repartition(3).write...,这样会生成3个part文件 - 如果需要输出表头,添加
.option("header", "true")即可 - 目录下会附带
_SUCCESS等元数据文件,不需要的话可以手动删除
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

