0

私はClouderaを使用していますが、Sparkのバージョンは2.1.0です。PySparkはImportErrorをスローしますが、モジュールは実際に存在し、うまく動作します。

私は2つのテーブルをクロスジョインしようとしていて、ファジーマッチ率の列を作成しようとしていました(したがって、fuzzywuzzyをインポートする必要があります)。ここでは、コードです:

from fuzzywuzzy import fuzz 
def fuzzy_ratio(x,y): 
    from fuzzywuzzy import fuzz 
    res = fuzz.token_set_ratio(x,y) 
    return res 

fuzz_udf = F.udf(fuzzy_ratio,IntegerType()) # register UDF 

Master = tableA.crossJoin(tableB) \ 
       .withColumn('ratio',fuzz_udf(tableA['colA'],tableB['colB'])) 

そして、それは

ImportError: No module named fuzzywuzzy 

at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193) 
at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234) 
at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152) 
at org.apache.spark.sql.execution.python.BatchEvalPythonExec$$anonfun$doExecute$1.apply(BatchEvalPythonExec.scala:144) 
at org.apache.spark.sql.execution.python.BatchEvalPythonExec$$anonfun$doExecute$1.apply(BatchEvalPythonExec.scala:87) 
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:796) 

しかしfuzzy.token_set_ratio作品をスローした場合、インタラクティブシェルで、私はそれを入力。だから私は本当にここで何が起こっているのか分からない。

誰でも私の質問にお手伝いできますか?感謝万円!

答えて

0

これは、パッケージfuzzywuzzyがすべてのワーカーノードで利用できないためです。 1つの回避策は、このパッケージをすべてのワーカー・ノードにインストールすることです。

この設定を標準化するには、クラスタレベルの構成が必要です。詳細はthisクロウダリンクを参照してください。

+0

として後でsparkContextでこの依存関係を追加するオプションもあります。ありがとう! –

+0

@ JingyingZhou歓迎です - 答えを受け入れてください:) – user24225

0

私は同様のエラーが発生していました。私はspark submitコマンドにあいまいな依存関係を追加しました。

まず私の場合folders.In 2つのパッケージをZIP、フォルダの場所C:\Anaconda2\Lib\site-packages\fuzzywuzzyC:\Anaconda2\Lib\site-packages\fuzzywuzzy-0.15.0.dist-info

である私は、これは必ず、すべてのワーカーノードということになり ../bin/spark-submit /path/to/mycode.py --py-files /path/to/fuzzywuzzy.zip

として​​コマンドにzipファイルを追加しましたあいまいな依存関係を得る。

私はあなたが正しいと思いますspark.sparkContext.addPyFile('/path/to/fuzzywuzzy.zip')

関連する問題