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

如何在Databricks中拆分70GB大CSV文件解决PySpark读取GC问题?

解决大型CSV拆分与Driver GC问题

一、直接用PySpark拆分(推荐,无行截断问题)

不需要手动拆分文件,利用Spark分布式处理能力,读取后重新分区再写出,全程不会压垮Driver:

  1. 先优化读取参数,规避GC问题后读取文件:
# 关闭Schema自动推断,先以字符串类型读取,降低Driver内存占用
df = spark.read.csv(
    "/mnt/your-mount-path/large-file.csv",
    header=True,
    inferSchema=False,
    quote='"',
    escape='"'
)

# (可选)如果知道Schema,手动指定会更高效,示例:
# from pyspark.sql.types import StructType, StructField, StringType, IntegerType
# custom_schema = StructType([
#     StructField("user_id", IntegerType(), True),
#     StructField("user_name", StringType(), True),
#     # 补充其他列定义
# ])
# df = spark.read.csv("/mnt/your-mount-path/large-file.csv", header=True, schema=custom_schema)

# 按目标文件大小设置分区数,比如每个文件约1GB,70GB设70个分区
df_split = df.repartition(70)

# 写出到目标路径,自动生成多个part-xxx.csv文件
df_split.write.csv(
    "/mnt/your-mount-path/split-output/",
    header=True,
    mode="overwrite"
)

执行后,目标路径下会生成多个大小均匀的CSV文件,后续读取这些小文件即可避免GC问题。

二、Shell命令拆分(极端情况备用)

如果无法通过Spark读取原文件,可借助split命令拆分,但可能会截断行,需要后续处理:

# 先将大文件复制到DBFS临时目录提升处理速度
dbutils.fs.cp("/mnt/your-mount-path/large-file.csv", "/tmp/large-file.csv")

# 按1GB大小拆分文件,前缀为split-file-
%sh split -b 1G /dbfs/tmp/large-file.csv /dbfs/tmp/split-file-

# 将拆分后的文件复制回挂载存储
dbutils.fs.cp("/tmp/split-file-*", "/mnt/your-mount-path/split-output/", recurse=True)

三、避免Driver GC问题的额外建议

其实你遇到的GC问题,很多时候无需拆分就能解决:

  • 调整集群配置,增大Driver内存(在集群创建/编辑页面修改Driver Memory参数)
  • 配置spark.sql.files.maxPartitionBytes,让Spark自动将大文件拆分为更多小分区,分散处理压力
  • 读取时禁用inferSchema,手动指定Schema是降低Driver内存消耗的关键

内容的提问来源于stack exchange,提问作者Duccio Borchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:29