web-dev-qa-db-fra.com

PySpark Throwing error La méthode __getnewargs __ ([]) n'existe pas

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:

  • Créez un RDD en lisant all_files.txt
  • Pour chaque ligne dans all_files.txt (Chaque ligne est un chemin vers un fichier), lisez le contenu de chacun des fichiers dans un seul RDD
  • Faites ensuite une opération sur tout le contenu

Voici 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.

17
UnderWood

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)
19
Mariusz

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.

3
Mithril

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.

0
lucazav