2016-12-29 4 views
1

Wir haben zwei Datenrahmen df1 und df2 und ausführen Transformationen auf df2. Nachdem alle Transformationen auf df2 durchgeführt wurden, müssen wir das df1 in df2 anhängen. Dafür verwenden wir die Funktion unionAll.DAG Scheduler Wiederholen der Verarbeitungsstufen bei der Verwendung von UnionAll

val v_asciiFileWithHeader = v_header.unionAll(vr_dataframeAsciiFile) 

Aber nach unionAll, wenn wir seine DAG drucken, seine über alle Bearbeitungsschritte wieder, aufgrund derer die gesamte Verarbeitung zweimal fertig sind zu wiederholen, wenn eine Aktion aufgerufen wird.

Wenn wir die DF2 sind persistierende vor unionAll Anwendung, dann werden alle Verarbeitungsstufen werden nicht wiederholt.

Als Referenz haben die DAG für die Datenrahmen vor unionAll, angebracht nach UnionAll(without persisting df2) nach unionAll(with persisting df2)

Also, warum sich wiederholende sind Verarbeitungsstufen, wenn unionAll auf unpersisted Datenrahmen angewendet wird.

Funken Version - 1.6.1 Scala Version - 2.10.6

Print Schema for each dataframe

+0

Does Verarbeitungsteil von ‚DF2‘ schließen jede Aktion oder nur Transformationen? – code

+0

@code früher hatte es nur Transformationen. Aber für persistieren haben wir eine Aktion heißt hinzugefügt df2.count –

+0

früher auch df2 Transformationen zweimal ausgeführt wurden? – code

Antwort

2

Spark-DAG-Scheduler trennt Ihren ersten Satz von Transformationen in eine Stufe und Vereinigungsoperation als ein weitere Stufe. Außerdem entscheidet der DAG-Zeitplan, dass diese zwei Stufen parallel ausgeführt werden können, da sie nicht voneinander abhängig sind, sondern von einem gemeinsamen Elternteil.

Wenn es also zwei Stufen parallel ausgeführt wird, wird der gleiche Satz von Transformationen gleichzeitig ausgeführt werden.

Die Lösung, um dies zu vermeiden, ist zu zeigen, dass diese beiden Stufen voneinander abhängig sind und nicht parallel betrieben werden sollten. Wenn Sie also eine Aktion aufrufen und den Dataframe vor der Vereinigungsoperation beibehalten, wird Stufe 1 zuerst ausgeführt, da am Ende eine Aktion ausgeführt wird. Sobald diese Phase abgeschlossen ist, wird Stufe 2 (d. H. Eine Vereinigungsaktion) ausgeführt.

An diesem Punkt ist der für die Union erforderliche Datenrahmen bereits von stage-1 berechnet und beibehalten, so dass er so verwendet wird, wie er ist, anstatt ihn erneut zu berechnen.

Hope this verdeutlicht Ihre Zweifel.

+0

Ich konnte das nicht bekommen, obwohl wir Transformationen auf df2 anwendeten, die gleiche Transformation wurde auf die Ausgabe von df1.unionAll (df2) angewendet. –

+0

Ja, das liegt daran, dass der DAG-Plan die Umwandlung in einer Stufe (Stufe-1) ausführt) und Gewerkschaftsbetrieb in einer anderen Phase (Stufe 2). Jetzt überprüft der DAG-Scheduler, ob die in Stufe 2 beteiligten Datenrahmen berechnet sind oder nicht. Da beide Stufen parallel verlaufen, werden Datenrahmen noch nicht berechnet. Also berechnet es den Datenrahmen, der in Stufe 1 berechnet wird, erneut in Stufe 2. – code

Verwandte Themen