You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中将DataFrame保存为GZ格式文本文件(非CSV)

解决方案

针对你的需求,我分两种常用的场景来给出具体实现方法,分别是Pandas和PySpark,你可以根据自己的使用场景选择:

一、使用Pandas处理

如果你的DataFrame是Pandas对象,由于Pandas默认生成单个文件,要生成多个part-xxxxxx.gz格式的文件,需要手动分片后逐个保存:

  1. 先确定分片数量(比如按行数均分,或者你指定分片数)
  2. 遍历每个分片,按指定格式保存

示例代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:06