保存Spark Dataframe为ADLS Gen1 Delta表前如何预判生成文件数量
写入文件数量预判方法
默认情况下,Spark写入生成的文件数量与DataFrame的分区数一致,你可以在写入前执行以下代码获取当前分区数,即为默认生成的文件数量:
# PySpark 示例 print(df.rdd.getNumPartitions())
// Scala 示例 println(df.rdd.getNumPartitions)
如果使用Delta格式写入,还会受delta.targetFileSize参数影响:当单个分区的数据量超过配置的目标文件大小时,Delta会自动拆分文件,你可以通过「总数据量 ÷ 目标单文件大小」来估算最终的文件数量,建议单文件大小控制在128M~1G区间。
ADLS Gen1最大文件创建配额查询方法
ADLS Gen1的文件创建操作限流阈值和账户配置的*吞吐量单位(TU)*直接挂钩:每个吞吐量单位每秒最多支持100次CREATE操作,你可以通过以下两种方式查询:
- 登录Azure门户,进入对应ADLS Gen1账户的「性能」配置页,查看当前配置的吞吐量单位总数,乘以100即可得到每秒最大允许的文件创建请求数。
- 查看Azure Monitor中该ADLS账户的
ThrottledRequests指标,筛选操作类型为CREATE的历史记录,也可以反推当前的限流阈值。
问题优化方案
你可以通过以下方式避免CREATE操作限流:
- 写入前合并DataFrame分区,减少最终生成的文件数量:
# 合并为10个分区,即最终生成约10个文件,可根据总数据量调整数值 df = df.coalesce(10) - 写入时指定Delta目标文件大小,避免自动生成大量小文件:
df.write.format("delta").mode("overwrite") \ .option("delta.targetFileSize", "134217728") \ # 128MB .saveAsTable("database_name.df", path ='adl://my path to storage') - 若单次写入的文件量不可缩减,可适当降低写入并行度,或者拆分数据分批次写入,避免短时间内发起大量CREATE请求触达限流阈值。
内容的提问来源于stack exchange,提问作者DataBach
相关产品推荐
相关产品推荐

