ファイルのセットがあります。ファイルへのパスはファイルに保存されます。たとえば、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)
誰かが私が間違っていることと、私がさらに進める方法を教えてください。前もって感謝します。
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)
私は今日この問題に出会い、最終的にspark.DataFrame
のpandas_udf
オブジェクトを参照したことがわかり、このエラーが発生しました。
結論:
sparkSession
オブジェクト、spark.DataFrame
オブジェクト、またはその他のSpark udf
およびpandas_udf
の分散オブジェクトは使用できないため、これらを使用することはできません。酸っぱい。
このエラーが発生し、udf
を使用している場合は、慎重に確認してください。相対的な問題である必要があります。
モデル自体がmlflow.sklearn.log_model
モデルであるときに、pyspark.ml.classification
を使用してMLFlowでモデルをログに記録しようとすると、このエラーも発生しました。 mlflow.spark.log_model
を使用して問題を解決しました。