Spark --py-files对Python生成的Zip无效,Mac压缩则正常
解决Spark --py-files加载Python包Zip时ModuleNotFoundError问题
问题核心原因
手动压缩(Mac右键)能正常加载,Python代码生成的Zip报错,核心差异是Zip内的目录结构:
- 手动压缩时,你是将
packages文件夹内的hvac、certifi等包目录直接压缩到Zip根目录; - 而Python代码生成的Zip里,这些包目录被嵌套在
packages目录下,导致Spark无法直接找到hvac模块。
修正后的压缩代码
调整压缩逻辑,确保包目录直接位于Zip根目录,而非嵌套在packages文件夹下:
import os import zipfile def zip_dirs() -> None: path = "./packages" # 指定存放依赖的packages目录路径 with zipfile.ZipFile('packages.zip', 'w', zipfile.ZIP_DEFLATED) as zip_file: # 遍历packages目录下的所有文件和子目录 for root, _, files in os.walk(path): for file in files: if file == '.DS_Store': continue # 获取文件的绝对路径 file_path = os.path.join(root, file) # 计算Zip内的相对路径:相对于packages目录,而非父目录 arcname = os.path.relpath(file_path, path) zip_file.write(file_path, arcname)
验证步骤
- 运行修改后的函数生成Zip文件;
- 解压Zip,检查根目录是否直接包含
hvac、certifi等包文件夹(而非嵌套在packages目录下); - 将该Zip上传到S3,通过Spark的
--py-files参数加载,即可正常导入hvac模块。
补充:shutil的正确用法
如果想用shutil实现相同效果,需先进入packages目录再压缩内容:
import shutil import os # 切换到packages目录 os.chdir("./packages") # 压缩当前目录下所有内容到上级目录的packages.zip shutil.make_archive('../packages', 'zip', root_dir='.') # 切回原工作目录 os.chdir("..")
内容的提问来源于stack exchange,提问作者Ema Il
相关产品推荐
相关产品推荐

