从Spark中EMR上的.zip文件(使用zipfile包在python中创建)和--py文件导入模块时出现问题
我正在尝试将我的应用程序归档到我的测试文件中,以便在EMR群集上进行spark submit,如下所示:从Spark中EMR上的.zip文件(使用zipfile包在python中创建)和--py文件导入模块时出现问题,python,python-3.x,pyspark,amazon-emr,Python,Python 3.x,Pyspark,Amazon Emr,我正在尝试将我的应用程序归档到我的测试文件中,以便在EMR群集上进行spark submit,如下所示: with zipfile.ZipFile('deps.zip','w') as zipf: for file in file_paths: zipf.write(file,os.path.relpath(file,'..')) 模块的文件夹结构: app --- module1 ------ test.py ------ test2.py --- m
with zipfile.ZipFile('deps.zip','w') as zipf:
for file in file_paths:
zipf.write(file,os.path.relpath(file,'..'))
模块的文件夹结构:
app
--- module1
------ test.py
------ test2.py
--- module2
------ file1.py
------ file2.py
我在测试中调用的Zip函数
import zipfile
import os
def zip_deps():
# make zip
module1_path = '../module1'
module2_path = '../module2'
try:
with zipfile.ZipFile('deps.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
info = zipfile.ZipInfo(module1_path +'/')
zipf.writestr(info, '')
for root, dirs, files in os.walk(module1_path):
for d in dirs:
info = zipfile.ZipInfo(os.path.join(root, d)+'/')
zipf.writestr(info, '')
for file in files:
zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
info = zipfile.ZipInfo(module2_path +'/')
zipf.writestr(info, '')
for root, dirs, files in os.walk(module2_path):
for d in dirs:
info = zipfile.ZipInfo(os.path.join(root, d)+'/')
zipf.writestr(info, '')
for file in files:
zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
except:
print('Unexpected error occurred while creating file deps.zip')
zipf.close()
deps.zip创建正确,据我所知,它可以压缩我想要的所有文件,并且每个模块文件夹都位于zip的基本级别。
事实上,确切的zip是使用以下方法创建的:
zip-r deps.zip模块1模块2
是相同的结构,当我使用spark提交它时,它会起作用
spark-submit --py-files deps.zip driver.py
来自EMR的错误:
Traceback (most recent call last):
File "driver.py", line 6, in <module>
from module1.test import test_function
ModuleNotFoundError: No module named 'module1'
我不知道为什么在python中创建的zip文件会不同于在python之外创建的zip文件,但我已经花了几天的时间在这方面,希望有人能提供帮助
谢谢 事实证明这是一件相当简单的事情 Zipfile正在使用相对目录保存完整文件名,如:
../module1/test.py
spark将文件夹排除在顶层,但没有相对路径,如:
module1/test.py
我只是不得不改变我的写作方式:
with zipfile.ZipFile('deps.zip','w') as zipf:
for file in file_paths:
zipf.write(file,os.path.relpath(file,'..'))
如果提取原始zip文件,您将永远看不到前面有
。/
的名称。耸耸肩工作和非工作的zip解压缩到同一个东西上吗?对我来说,它们看起来完全一样,是的。为了补充参考,我一直在尝试其他问题,所以我想知道差异是否是zipfile.zip_DEFLATED