Как импортировать библиотеку Python matplotlib в pyspark с помощью sc.addPyFile ()? - PullRequest
0 голосов
/ 20 декабря 2018

Я использую spark на python, итеративно запускаю команду pyspark из Терминала, а также запускаю весь скрипт с помощью команды spark-submit pythonFile.py

Я использую для анализа локального файла csv, поэтому никакие распределенные вычисления не выполняются.

Я хотел бы использовать библиотеку matplotlib для построения столбцов данных.При импорте matplotlib я получаю ошибку ImportError: No module named matplotlib.Затем я наткнулся на этот вопрос и попробовал команду sc.addPyFile(), но вы не смогли найти ни одного файла, относящегося к matplotlib, который я мог бы передать ему в моей ОС (OSX).

Для этогоЯ создал виртуальную среду и установил с ней matplotlib.Навигация по виртуальной среде, в которой я обнаружил, не было файла, такого как marplotlib.py, поэтому я попытался передать ему всю папку sc.addPyFile("venv//lib/python3.7/site-packages/matplotlib"), но снова безуспешно.

Я не знаю, какой файл мне включать или какв этот момент у меня закончились идеи.

Есть ли простой способ импортировать библиотеку matplotlib в spark (установка с помощью virtualenv или ссылка на установку ОС)?И если да, то в каких *.py файлах я должен передать команду sc.addPyFile()

Опять меня не интересуют распределенные вычисления: код python будет запускаться только локально на моей машине.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я опубликую то, что я сделал.Прежде всего, я работаю с virtualenv.Итак, я создал новый с virtualenv path.

Затем я активировал его с source path/bin/activate.

Я установил нужные мне пакеты с pip3 install packageName.

Послечто я создал скрипт на python, который создает zip-архив библиотек, установленных с помощью virtualenv по пути `./path/lib/python3.7/site-packages/.

Код этого скрипта:следующее (это только 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

Когда вы запускаете скрипт, вы должны ссылаться на zip-архивы в команде с помощью --py-files.Например:

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

Я рассмотрел два архива, потому что мне было понятно, как импортировать один, а не два из них.

0 голосов
/ 24 декабря 2018

Вы можете заархивировать каталог matplotlib и передать его в addPyFile().Или же вы можете определить переменную среды, которая включает в себя пользовательские пакеты: export PYTHONPATH="venv//lib/python3.7/site-packages/:$PYTHONPATH"

...