Как получить библиотеки Python в pyspark?
Я хочу использовать matplotlib.bblpath или shapely.библиотеки геометрии в pyspark.
когда я пытаюсь импортировать любой из них, я получаю следующую ошибку:
>>> from shapely.geometry import polygon
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named shapely.geometry
Я знаю, что модуль отсутствует, но как эти пакеты могут быть доставлены в мои библиотеки pyspark?
3 ответов
в контексте Spark попробуйте использовать:
SparkContext.addPyFile("module.py") # also .zip
со ссылкой на docs:
добавить a .пай ор .зип зависимостей для всех задач, которые будут выполняться на этом SparkContext в будущем. Пройденный путь может быть локальным файл, файл в HDFS (или других файловых системах, поддерживаемых Hadoop) или HTTP, HTTPS или FTP URI.
Так я работаю в нашем кластере AWS EMR (он должен быть таким же и в любом другом кластере). Я создал следующий сценарий оболочки и выполнил его как bootstrap-actions:
#!/bin/bash
# shapely installation
wget http://download.osgeo.org/geos/geos-3.5.0.tar.bz2
tar jxf geos-3.5.0.tar.bz2
cd geos-3.5.0 && ./configure --prefix=$HOME/geos-bin && make && make install
sudo cp /home/hadoop/geos-bin/lib/* /usr/lib
sudo /bin/sh -c 'echo "/usr/lib" >> /etc/ld.so.conf'
sudo /bin/sh -c 'echo "/usr/lib/local" >> /etc/ld.so.conf'
sudo /sbin/ldconfig
sudo /bin/sh -c 'echo -e "\nexport LD_LIBRARY_PATH=/usr/lib" >> /home/hadoop/.bashrc'
source /home/hadoop/.bashrc
sudo pip install shapely
echo "Shapely installation complete"
pip install https://pypi.python.org/packages/74/84/fa80c5e92854c7456b591f6e797c5be18315994afd3ef16a58694e1b5eb1/Geohash-1.0.tar.gz
#
exit 0
Примечание: вместо запуска в качестве начальной загрузки-действия этот скрипт может выполняться независимо в каждом узле кластера. Я проверил оба сценария.
Ниже приведен пример кода pyspark и shapely (Spark SQL UDF), чтобы убедиться, что приведенные выше команды работают как ожидалось:
Python 2.7.10 (default, Dec 8 2015, 18:25:23)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 1.6.1
/_/
Using Python version 2.7.10 (default, Dec 8 2015 18:25:23)
SparkContext available as sc, HiveContext available as sqlContext.
>>> from pyspark.sql.functions import udf
>>> from pyspark.sql.types import StringType
>>> from shapely.wkt import loads as load_wkt
>>> def parse_region(region):
... from shapely.wkt import loads as load_wkt
... reverse_coordinate = lambda coord: ' '.join(reversed(coord.split(':')))
... coordinate_list = map(reverse_coordinate, region.split(', '))
... if coordinate_list[0] != coordinate_list[-1]:
... coordinate_list.append(coordinate_list[0])
... return str(load_wkt('POLYGON ((%s))' % ','.join(coordinate_list)).wkt)
...
>>> udf_parse_region=udf(parse_region, StringType())
16/09/06 22:18:34 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
16/09/06 22:18:34 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
>>> df = sqlContext.sql('select id, bounds from <schema.table_name> limit 10')
>>> df2 = df.withColumn('bounds1', udf_parse_region('bounds'))
>>> df2.first()
Row(id=u'0089d43a-1b42-4fba-80d6-dda2552ee08e', bounds=u'33.42838509594465:-119.0533447265625, 33.39170168789402:-119.0203857421875, 33.29992542601392:-119.0478515625', bounds1=u'POLYGON ((-119.0533447265625 33.42838509594465, -119.0203857421875 33.39170168789402, -119.0478515625 33.29992542601392, -119.0533447265625 33.42838509594465))')
>>>
спасибо, В Нью-Хуссейн
это автономно (например, ноутбук / рабочий стол) или в кластерной среде (например, AWS EMR)?
Если на вашем ноутбуке/рабочий стол,
pip install shapely
должно работать нормально. Возможно, Вам потребуется проверить переменные среды для среды python по умолчанию. Например, если вы обычно используете Python 3, но используете Python 2 для pyspark, то у вас не будет shapely для pyspark.-
Если в кластерной среде, например в AWS EMR, вы можете попробуйте:
import os def myfun(x):` os.system("pip install shapely") return x rdd = sc.parallelize([1,2,3,4]) ## assuming 4 worker nodes rdd.map(lambda x: myfun(x)).collect() ## call each cluster to run the code to import the library
" Я знаю, что модуль отсутствует, но я хочу знать, как эти пакеты могут быть доставлены в мои библиотеки pyspark."
в EMR, если вы хотите, чтобы pyspark был предварительно подготовлен с любыми другими библиотеками и конфигурациями, вы можете использовать шаг начальной загрузки для внесения этих корректировок. Кроме того, вы не можете "добавить" библиотеку в pyspark без компиляции Spark в Scala (что было бы больно делать, если вы не разбираетесь в SBT).