web-dev-qa-db-ja.com

pysparkでPythonライブラリを取得するにはどうすればよいですか?

Pysparkでmatplotlib.bblpathまたはshapely.geometryライブラリを使用したい。

それらのいずれかをインポートしようとすると、次のエラーが表示されます。

>>> from shapely.geometry import polygon
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ImportError: No module named shapely.geometry

モジュールが存在しないことは知っていますが、これらのパッケージをどのようにpysparkライブラリに取り込むことができますか?

11
thenakulchawla

Spark=コンテキストで使用してみてください:

SparkContext.addPyFile("module.py")  # also .Zip

docs からの引用:

今後このSparkContextで実行されるすべてのタスクの.pyまたは.Zip依存関係を追加します。渡されるパスは、ローカルファイル、HDFS(またはその他のHadoopでサポートされるファイルシステム)のファイル、またはHTTP、HTTPS、FTP URIのいずれかです。

16
armatita

これが、AWS EMRクラスターで動作する方法です(他のクラスターでも同じである必要があります)。次のシェルスクリプトを作成し、ブートストラップアクションとして実行しました。

#!/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))')
>>> 

ありがとう、フセイン・ボーラ

7
Hussain Bohra

これは、スタンドアロン(ラップトップ/デスクトップ)上ですか、クラスター環境(AWS EMRなど)ですか?

  1. ノートパソコン/デスクトップの場合、pip install shapelyは問題なく動作するはずです。デフォルトのpython environment(s)の環境変数を確認する必要がある場合があります。たとえば、通常Python 3を使用するが、Python 2で、pysparkの場合はうまく利用できません。

  2. 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に必要な他のライブラリと構成を事前に準備する場合、bootstrapステップを使用してこれらの調整を行うことができます。それ以外に、「コンパイルせずにライブラリをpysparkに追加しますSpark in Scala(SBTに精通していない場合、これは苦痛になります)。

2
Jon