J'ai un ensemble de fichiers. Le chemin d'accès aux fichiers est enregistré dans un fichier., Par exemple all_files.txt
. En utilisant Apache spark, je dois effectuer une opération sur tous les fichiers et associer les résultats.
Les étapes que je veux faire sont:
all_files.txt
all_files.txt
(Chaque ligne est un chemin vers un fichier), lisez le contenu de chacun des fichiers dans un seul RDDVoici le code que j'ai écrit pour le même:
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
Cela jette l'erreur:
ligne 323, dans get_return_value py4j.protocol.Py4JError: Une erreur s'est produite lors de l'appel de o25 .getnewargs. Trace: py4j.Py4JException: la méthode getnewargs ([]) n'existe pas sur py4j.reflection.ReflectionEngine.getMethod (ReflectionEngine.Java:318) sur py4j.reflection.ReflectionEngine.getMethod (ReflectionEngine.Java: 326) sur py4j.Gateway.invoke (Gateway.Java:272) sur py4j.commands.AbstractCommand.invokeMethod (AbstractCommand.Java:132) sur py4j.commands.CallCommand.execute (CallCommand.Java:79) sur py4j.GatewayConnection. exécuter (GatewayConnection.Java:214) sur Java.lang.Thread.run (Thread.Java:745)
Quelqu'un peut-il me dire ce que je fais mal et comment je dois continuer? Merci d'avance.
L'utilisation de spark
dans flatMap
ou de toute transformation qui se produit sur les exécuteurs n'est pas autorisée (la session spark
est disponible uniquement sur le pilote). Il n'est pas non plus possible de créer des RDD de RDD (voir: Est-il possible de créer des RDD imbriqués dans Apache Spark? )
Mais vous pouvez réaliser cette transformation d'une autre manière - lisez tout le contenu de all_files.txt
dans la trame de données, utilisez local map
pour en faire des trames de données et local reduce
pour tout réunir, voir exemple:
>>> 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)
Je rencontre ce problème aujourd'hui, enfin comprendre que j'ai fait référence à un spark.DataFrame
objet dans pandas_udf
, qui résulte de cette erreur.
La conclusion:
Vous ne pouvez pas utiliser l'objet sparkSession
, spark.DataFrame
objet ou autre Spark objets distribués dans udf
et pandas_udf
, car ils sont décrochés.
Si vous rencontrez cette erreur et que vous utilisez udf
, vérifiez-la attentivement, cela doit être un problème relatif.
J'ai également eu cette erreur en essayant de connecter mon modèle avec MLFlow en utilisant mlflow.sklearn.log_model
lorsque le modèle lui-même était un pyspark.ml.classification
modèle. En utilisant mlflow.spark.log_model
a résolu le problème.