如何将spark-submit命令中的脚本路径传入Python脚本用于文件写入?
解决Spark Submit脚本路径获取与文件写入位置一致的问题
核心实现方案
要实现从不同目录层级运行脚本时文件写入位置一致,关键是准确获取spark-submit命令中传入的脚本路径,再基于该路径的目录部分构建写入路径:
获取提交时的脚本路径
spark-submit执行时,脚本路径是命令的最后一个参数,直接通过Python的sys.argv即可获取:import sys import os # 提取spark-submit命令中传入的脚本路径 submit_script_path = sys.argv[-1] # 解析出脚本所在的目录 script_dir = os.path.dirname(submit_script_path)构建固定相对写入路径
基于上述目录拼接写入文件的路径,这样无论你用绝对路径还是相对路径提交脚本,写入文件都会和提交时指定的脚本路径处于同一层级:# 示例:在脚本所在目录下写入output.txt write_path = os.path.join(script_dir, "output.txt") # 执行写入操作 with open(write_path, "w") as f: f.write("测试内容")
替代方案
如果依赖脚本路径的方式不够灵活,还可以选择以下方案:
显式传递写入路径参数
直接在spark-submit命令中把目标写入路径作为脚本参数传入,这种方式更直观可控:# 命令行传入写入路径 spark-submit --master local[*] spark.py /home/new/user/target_output_dir脚本中读取参数:
write_dir = sys.argv[1] write_path = os.path.join(write_dir, "output.txt")通过Spark配置传递路径
利用Spark的配置参数传递写入路径,适合需要和Spark集群配置联动的场景:# 通过--conf传递写入目录 spark-submit --conf spark.app.write.dir=/home/new/user/target_output_dir --master local[*] spark.py脚本中从Spark配置读取:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() write_dir = spark.sparkContext.getConf().get("spark.app.write.dir") write_path = os.path.join(write_dir, "output.txt")使用脚本真实物理路径(参考方案)
如果你需要固定到脚本实际所在的物理目录(而非提交时的层级路径),可以用os.path.abspath(__file__)获取脚本的绝对路径,但这不符合你要求的“执行时层级路径”场景,仅作参考:script_real_dir = os.path.dirname(os.path.abspath(__file__)) write_path = os.path.join(script_real_dir, "output.txt")
内容的提问来源于stack exchange,提问作者N3wU53r
相关产品推荐
相关产品推荐

