如何使用 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")
我在 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/
.
此脚本的代码如下(仅压缩 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")