2016-07-07 11 views
0

Ich versuche, zwei kleine Datenrahmen der Zusammenfassung Statistiken, jeweils mit den gleichen Spalten in der gleichen Reihenfolge und übereinstimmenden dtypes. Der erste Datenrahmen ist einfach das Ergebnis des Aufrufens von describe auf (einer Teilmenge von) meinem Hauptdatenrahmen; die zweite ist zwei weitere Arten von zusammenfassenden Statistiken, die ich zusammengestellt habe und die ich an die erste anhängen möchte. Wenn ich versuche, df1.unionAll(df2) ich die folgende Fehlermeldung erhalten:"Task nicht serialisierbar" Fehler in pySpark auf unionAll

Py4JJavaError: An error occurred while calling o330.collectToPython. : org.apache.spark.SparkException: Task not serializable

Allerdings funktioniert es ganz gut, wenn ich sie in Listen sammeln, verketten sie, so dass sie dann wieder parallelisieren:

df1_c = df1.collect() 
df1_c 

[Row(summary=u'count', C0=u'3526154', C3=u'3526154', C4=u'1580402', C5=u'3526154', C6=u'3526154'), Row(summary=u'mean', C0=u'5.50388599500189E11', C3=u'4.178168090221902', C4=u'234846.78065481802', C5=u'5.134865351881966', C6=u'354.7084951479714'), Row(summary=u'stddev', C0=u'2.5961123619752225E11', C3=u'0.34382335723646484', C4=u'118170.68592261615', C5=u'3.3833930336063456', C6=u'4.011812510792076'), Row(summary=u'min', C0=u'100002091588', C3=u'2.75', C4=u'0.85', C5=u'-1', C6=u'292'), Row(summary=u'max', C0=u'999995696635', C3=u'6.125', C4=u'1193544.39', C5=u'34', C6=u'480')]

df2_c = df1.collect() 
df2_c 

[Row(summary=u'skew', C0=u'-0.00183847089857', C3=u'0.519799339496', C4=u'0.758411576756', C5=u'0.286480156084', C6=u'-2.69765201567'), Row(summary=u'kurtosis', C0=u'-1.19900726351', C3=u'0.126057726847', C4=u'0.576085602656', C5=u'0.195187780089', C6=u'24.7237858944')]

dd1 = df1.collect() 
dd2 = df2.collect() 
dd3 = dd1 + dd2 
new_df = sc.parallelize(dd3).toDF() 
new_df.show() 

(A new dataframe with the previous two stacked just the way they should be, but looks messy here because it's too big so I'm leaving it off)

Ich kann auch parallelisieren und rufen Sie toDF auf jeder gesammelten Liste, dann rufen Sie unionAll auf die neuen Datenrahmen, und das funktioniert gut. Diese Operation sollte immer nur auf kleinen Datenframes passieren, da es sich nur um statistische Statistiken handelt, aber zuerst in einer Liste gesammelt zu werden scheint offensichtlich nicht richtig. Und ich habe unionAll erfolgreich auf Datenrahmen in der Vergangenheit ohne Problem verwendet. Gibt es etwas anderes über einen Datenrahmen, der aus describe erstellt wurde, und einen anderen, der aus parellisierenden Objekten erstellt wurde? Sie sehen identisch aus mit show, und wenn gesammelt - die collect-Ausgabe oben ist tatsächliche Daten, ich habe das Problem mit. Jeder Einblick, warum unionAll ist hier verärgert wäre toll.

Bearbeiten: Zu meiner Bestürzung konnte ich dies nicht zu einem minimalen reproduzierbaren Beispiel mit Spielzeugdaten machen - das heißt, wenn ich einige zufällige Werte paralelliere, beschreibe sie, dann erzeuge eine Reihe und versuche sie auf die zu stapeln beschreiben, es funktioniert gut. Dies deutet darauf hin, dass es etwas Spezifisches in meinen Daten oder meiner Methodik gibt, das das irgendwie abtut. Das macht natürlich die Aussichten, hier eine Lösung zu finden, sehr viel schlanker, daher entschuldige ich mich im Voraus.

+0

Ich denke, es gab einige Fehler in einer der früheren Versionen, aber [MCVE] mit Versionen, die Sie verwenden, wäre nett. – zero323

+0

Ich habe gerade eine Bearbeitung hinzugefügt. Möglicherweise muss ich die Frage entfernen, bis ich einen Weg finde, sie zu reproduzieren. – Jeff

+0

Huh, ich bin mir immer noch ziemlich sicher, dass ich dieses Problem schon einmal gesehen habe. Aber ich kann mich nicht wirklich erinnern, wo. Auf die eine oder andere Weise wahrscheinlich nicht etwas, das Sie mit Ihrem Code allein lösen können. – zero323

Antwort

Verwandte Themen