如何在Databricks中拆分70GB大CSV文件解决PySpark读取GC问题?
解决大型CSV拆分与Driver GC问题
一、直接用PySpark拆分(推荐,无行截断问题)
不需要手动拆分文件,利用Spark分布式处理能力,读取后重新分区再写出,全程不会压垮Driver:
- 先优化读取参数,规避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
相关产品推荐
相关产品推荐

