web-dev-qa-db-ja.com

PySparkスローエラーメソッド__getnewargs __([])が存在しません

ファイルのセットがあります。ファイルへのパスはファイルに保存されます。たとえば、all_files.txtと言います。 Apache Sparkを使用して、すべてのファイルに対して操作を実行し、結果を整理する必要があります。

私がやりたいステップは次のとおりです。

  • all_files.txtを読み取ってRDDを作成します
  • all_files.txtの各行について(各行はファイルへのパスです)、各ファイルの内容を単一のRDDに読み取ります
  • 次に、すべてのコンテンツの操作を行います

これは私が同じために書いたコードです:

def return_contents_from_file (file_name):
    return spark.read.text(file_name).rdd.map(lambda  r: r[0])

def run_spark():
    file_name = 'path_to_file'

    spark = SparkSession \
        .builder \
        .appName("PythonWordCount") \
        .getOrCreate()

    counts = spark.read.text(file_name).rdd.map(lambda r: r[0]) \ # this line is supposed to return the paths to each file
        .flatMap(return_contents_from_file) \ # here i am expecting to club all the contents of all files
        .flatMap(do_operation_on_each_line_of_all_files) # here i am expecting do an operation on each line of all files

これはエラーを投げています:

323行目のget_return_value py4j.protocol.Py4JError:o25 .getnewargsの呼び出し中にエラーが発生しました。トレース:py4j.Py4JException:メソッドgetnewargs([])は、py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.Java:318)at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.Java: 326)py4j.Gateway.invoke(Gateway.Java:272)at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.Java:132)at py4j.commands.CallCommand.execute(CallCommand.Java:79)at py4j.GatewayConnection。 run.GatewayConnection.Java:214)at Java.lang.Thread.run(Thread.Java:745)

誰かが私が間違っていることと、私がさらに進める方法を教えてください。前もって感謝します。

17
UnderWood

spark内でflatMapを使用するか、エグゼキュータで発生する変換は許可されません(sparkセッションはドライバでのみ使用できます)。 RDDのRDDを作成することもできません(参照: Apache SparkでネストされたRDDを作成することは可能ですか?

ただし、この変換は別の方法で実現できます。all_files.txtのすべてのコンテンツをデータフレームに読み取り、localmapを使用してそれらのデータフレームとlocalreduceをすべて結合するには、例を参照してください:

>>> filenames = spark.read.text('all_files.txt').collect()
>>> dataframes = map(lambda r: spark.read.text(r[0]), filenames)
>>> all_lines_df = reduce(lambda df1, df2: df1.unionAll(df2), dataframes)
19
Mariusz

私は今日この問題に出会い、最終的にspark.DataFramepandas_udfオブジェクトを参照したことがわかり、このエラーが発生しました。

結論:

sparkSessionオブジェクト、spark.DataFrameオブジェクト、またはその他のSpark udfおよびpandas_udfの分散オブジェクトは使用できないため、これらを使用することはできません。酸っぱい。

このエラーが発生し、udfを使用している場合は、慎重に確認してください。相対的な問題である必要があります。

3
Mithril

モデル自体がmlflow.sklearn.log_modelモデルであるときに、pyspark.ml.classificationを使用してMLFlowでモデルをログに記録しようとすると、このエラーも発生しました。 mlflow.spark.log_modelを使用して問題を解決しました。

0
lucazav