我正在python上使用spark
,从终端反复启动命令pyspark
,还使用命令spark-submit pythonFile.py
启动整个脚本
我用来分析本地csv
文件,因此不执行分布式计算。
我想使用库matplotlib
绘制数据框的列。导入matplotlib时,出现错误ImportError: No module named matplotlib
。然后我遇到this question并尝试了命令sc.addPyFile()
,但是您找不到与matplotlib相关的任何文件,可以在OS(OSX)上传递给它。
由于这个原因,我创建了一个虚拟环境并安装了matplotlib。在虚拟环境中浏览时,我发现没有marplotlib.py
之类的文件,因此我试图将整个文件夹sc.addPyFile("venv//lib/python3.7/site-packages/matplotlib")
传递给它,但同样没有成功。
我不知道我应该包括哪个文件,或者现在不知道该怎么办,我用尽了所有想法。
是否有一种简单的方法可以在spark内部导入matplotlib
库(使用virtualenv安装或参考OS安装)?如果是这样,我应该传递哪个*.py
文件命令sc.addPyFile()
同样,我对分布式计算不感兴趣:python代码将仅在我的计算机上本地运行。
答案 0 :(得分:0)
您可以压缩matplotlib目录并将其传递到addPyFile()
。或者,您也可以定义一个包含用户软件包的环境变量:export PYTHONPATH="venv//lib/python3.7/site-packages/:$PYTHONPATH"
答案 1 :(得分:0)
我将发布我的工作。首先,我正在与virtualenv
合作。所以我用virtualenv path
创建了一个新的。
然后我用source path/bin/activate
激活了它。
我用pip3 install packageName
安装了所需的软件包。
之后,我在python中创建了一个脚本,该脚本为在目录`./path/lib/python3.7/site-packages/中使用virtualenv安装的库创建了一个zip存档。
此脚本的代码如下(仅压缩numpy
):
import zipfile
import os
#function to archive a single package
def ziplib(general_path, libName):
libpath = os.path.dirname(general_path + libName) # this should point to your packages directory
zippath = libName + '.zip' # some random filename in writable directory
zf = zipfile.PyZipFile(zippath, mode='w')
try:
zf.debug = 3 # making it verbose, good for debugging
zf.writepy(libpath)
return zippath # return path to generated zip archive
finally:
zf.close()
general_path = './path//lib/python3.7/site-packages/'
matplotlib_name = 'matplotlib'
seaborn_name = 'seaborn'
numpy_name = 'numpy'
zip_path = ziplib(general_path, numpy_name) # generate zip archive containing your lib
print(zip_path)
此后,必须在pyspark文件myPyspark.py
中引用档案。您可以通过调用addPyFile()
类的方法sparkContext
来实现。之后,您可以像往常一样导入代码。就我而言,我执行了以下操作:
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
sc.addPyFile("matplot.zip") #generate with testZip.py
sc.addPyFile("numpy.zip") #generate with testZip.py
import matplotlib
import numpy
启动脚本时,请使用--py-files
在命令中引用zip归档文件。例如:
sudo spark-submit --py-files matplot.zip --py-files numpy.zip myPyspark.py
我考虑了两个档案,因为对我来说很清楚如何导入其中一个而不是两个。