如何使用sc.addPyFile()在pyspark中导入matplotlib python库?

时间:2018-12-20 16:06:25

标签: python matplotlib pyspark python-import libraries

我正在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代码将仅在我的计算机上本地运行。

2 个答案:

答案 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

我考虑了两个档案,因为对我来说很清楚如何导入其中一个而不是两个。