代码之家  ›  专栏  ›  技术社区  ›  roschach

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

  •  0
  • roschach  · 技术社区  · 6 年前

    spark 在python上,两者都以迭代方式启动命令 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") 但同样没有成功。

    有没有简单的导入方法 matplotlib spark内部的库(使用virtualenv安装或参考操作系统安装)?如果是,哪一个 *.py 我应该传递命令的文件 sc.addPyFile()

    同样,我对分布式计算不感兴趣:python代码将只在我的机器上本地运行。

    2 回复  |  直到 6 年前
        1
  •  2
  •   roschach    4 年前

    我将发布我所做的事情。首先,我是和你一起工作的 virtualenv virtualenv path .

    然后我启动了它 source path/bin/activate .

    我安装了我需要的软件包 pip3 install packageName

    之后,我用python创建了一个脚本,该脚本创建了路径中随virtualenv一起安装的库的zip存档 ./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 . 您可以通过调用方法来实现这一点 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 . 例如:

    sudo spark-submit --py-files matplot.zip --py-files numpy.zip myPyspark.py
    

        2
  •  0
  •   Manoj Singh    6 年前

    您可以压缩matplotlib目录并将其传递给 addPyFile() export PYTHONPATH="venv//lib/python3.7/site-packages/:$PYTHONPATH"