Spark能否修改写入前临时文件存储的_temporary目录路径?
答案:可以调整临时目录,且支持放入目标分区内
当然可以调整Spark写入操作前的临时文件存储路径!针对你想把_temporary文件夹放到目标分区目录内的需求,完全可行,下面给你两种实用的实现方式和注意事项:
方式一:通过Hadoop配置指定临时输出目录
Spark底层依赖Hadoop的文件系统API处理文件写入,所以可以直接通过配置Hadoop的输出目录参数,让临时文件生成在目标分区路径下:
- 操作步骤:在提交任务前或者代码中,设置
spark.hadoop.mapreduce.output.fileoutputformat.outputdir为你的目标分区完整路径。这样Spark在写入时,会直接在该分区目录下创建_temporary文件夹存储中间文件,写入完成后将数据移动到分区目录的最终位置,再自动清理临时文件。 - 代码示例(Scala版本):
// 设置目标分区路径为临时输出目录 spark.conf.set("spark.hadoop.mapreduce.output.fileoutputformat.outputdir", "/user/hive/warehouse/your_db.db/your_table/partition_col=target_value") // 写入指定分区 df.write.mode("overwrite").insertInto("your_db.your_table") - 代码示例(Python版本):
spark.conf.set("spark.hadoop.mapreduce.output.fileoutputformat.outputdir", "/user/hive/warehouse/your_db.db/your_table/partition_col=target_value") df.write.mode("overwrite").insertInto("your_db.your_table")
方式二:动态分区覆盖+直接写入分区路径
如果你的Spark版本在2.3及以上,可以借助动态分区覆盖模式,让临时目录直接生成在目标分区内:
- 操作步骤:
- 开启动态分区覆盖模式,确保只覆盖指定分区而非整个表;
- 直接将DataFrame写入目标分区的路径(或者通过
partitionBy指定分区列),此时Spark会将输出路径设为分区目录,临时文件自然就会生成在该目录下的_temporary文件夹中。
- 代码示例(Python版本):
# 开启动态分区覆盖模式 spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic") # 方式1:通过saveAsTable写入指定分区 df.write \ .mode("overwrite") \ .partitionBy("partition_col") \ .saveAsTable("your_db.your_table") # 方式2:直接写入分区路径 df.write \ .mode("overwrite") \ .save("/user/hive/warehouse/your_db.db/your_table/partition_col=target_value")
注意事项
- 权限问题:确保Spark作业的运行用户对目标分区目录有完整的读写权限,否则创建临时文件或移动数据时会抛出权限异常。
- 残留清理:如果作业中途失败,
_temporary目录可能会残留,建议定期清理这些残留的临时文件,避免占用存储空间。 - 版本兼容性:
spark.sql.sources.partitionOverwriteMode参数是Spark 2.3版本引入的,如果你使用的是更早的版本,建议优先使用方式一。
内容的提问来源于stack exchange,提问作者Alessandro




