Azure Databricks中PySpark分区写Parquet生成空文件求助
Azure Databricks分区写入Parquet生成空文件的原因及解决方法
原因分析
- Spark任务执行机制:每个Task执行后至少会生成一个文件,哪怕该Task没处理到任何数据。当某个分区对应的Task无数据可写时,就会留下空文件。
- 分区字段存在空值/特殊值:如果数据里
startYear字段有空值,Spark会自动创建对应的分区目录(比如startYear=null),这个目录下因无有效数据,就会生成空文件。 - 动态分区特性:Spark动态分区写入默认会为所有可能的分区创建目录,哪怕部分分区没有匹配的数据,对应的空文件是Task执行后的默认产物。
解决方法
- 过滤空值数据:写入前先筛掉
startYear为空的行,避免空分区生成:from pyspark.sql.functions import col df.filter(col("startYear").isNotNull())\ .write.format('parquet')\ .partitionBy("startYear")\ .save(output_path) - 控制文件生成数量:写入时用
maxRecordsPerFile或coalesce/repartition限制每个分区的文件数,减少空文件概率:df.write.format('parquet')\ .partitionBy("startYear")\ .option("maxRecordsPerFile", 100000)\ # 按单文件最大记录数控制 .save(output_path) - 禁用空分区写入(Spark 3.2+):设置Spark配置关闭空分区的空文件生成:
spark.conf.set("spark.sql.sources.emptyPartitionWrite.enabled", "false") - 合并已有空文件:如果已经生成了空文件,可以用Databricks的文件合并命令清理:
-- 若数据已注册为表 ALTER TABLE your_table_name REPARTITION -- 或直接针对路径操作 spark.sql("ALTER TABLE parquet.`{}` REPARTITION".format(output_path))
内容的提问来源于stack exchange,提问作者Darkstorm
相关产品推荐
相关产品推荐

