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

How to import matplotlib python library in pyspark using sc.addPyFile()?

我在 python 上使用 spark 从终端迭代地启动命令 pyspark 并使用命令 spark-submit pythonFile.py

启动整个脚本

我正在使用分析本地 csv 文件,因此没有执行分布式计算。

我想使用库 matplotlib 来绘制数据框的列。导入 matplotlib 时出现错误 ImportError: No module named matplotlib。然后我遇到 并尝试了命令 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 代码将 运行 仅在我的机器上本地运行。

您可以压缩 matplotlib 目录并将其传递给 addPyFile()。或者您可以定义一个包含用户包的环境变量:export PYTHONPATH="venv//lib/python3.7/site-packages/:$PYTHONPATH"

我会post我所做的。首先,我正在与 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。您可以通过调用 sparkContext class 的方法 addPyFile() 来完成此操作。之后你就可以像往常一样导入你的代码了。在我的例子中,我做了以下事情:

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

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

用您的代码创建一个 py 文件。将 pyfile 添加到 spark 上下文。

import matplotlib.pyplot as plt
plt.<your operations>

将文件另存为 file.py。将其添加到 sparkcontext

spark.sparkContext.addPyFile("file.py")