2016-12-20 3 views
0

Ich erhalte die folgende Warnmeldung, wenn ich die Fensterfunktion in SparkSQL verwende. Kann mir bitte jemand sagen, wie man dieses Problem beheben kann.Warnmeldung bei der Verwendung einer Fensterfunktion in SparkSQL Dataframe

Warnung Nachricht: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

Mein Code: def calcPrevBrdrx(df: DataFrame): DataFrame = { val w = Window.orderBy("existing_col1") df.withColumn("new_col", lag("existing_col2", 1).over(w)) }

+0

Im Grunde füge ich eine neue Spalte (new_col) hinzu, die nur eine 1-zeilige Folie im Vergleich zu 'existing_col2' ist, indem ich die Fensterverzögerungsfunktion verwende. – Ramesh

+0

Ich konnte in dem neuen Datenrahmen sehen, dass die neue Spalte 'new_col' korrekt wie erwartet erstellt wird. Aber ich bekomme eine Warnmeldung wie oben gesagt. – Ramesh

Antwort

0

Die Warnung ist genau das, was es sagt. Im Allgemeinen, wenn Sie eine Fensterfunktion verwenden, würden Sie zuerst nach einer Spalte partitionieren und erst dann sortieren. Wenn Sie beispielsweise Protokolle für einen Benutzer erstellt haben, können Sie diese durch den Benutzer partitionieren und dann nach Zeit sortieren, wodurch die Sortierung für jeden Benutzer getrennt durchgeführt wird.

Wenn Sie bis dahin keine Partition haben, sortieren Sie den gesamten Datenrahmen. Das würde bedeuten, dass Sie eine einzelne Partition haben. Alle Daten von allen Datenrahmen würden auf diese einzelne Partition verschoben und sortiert werden.

Dies wäre langsam (Sie mischen alles und sortieren dann alles) und schlimmer bedeutet dies, dass alle Ihre Daten in eine einzige Partition passen müssen, die nicht skalierbar ist.

Sie sollten sich wahrscheinlich Ihre Logik ansehen, um sicherzustellen, dass Sie wirklich alles sortieren müssen, anstatt vorher etwas zu partitionieren.

+0

Ja, ich habe versucht, dies durch Window.orderBy ("existing_col1") zu tun. PartitionBy ("existing_col2", "existing_col3") – Ramesh

+0

Ja, ich habe versucht, dies durch Window.orderBy ("existing_col1"). PartitionBy ("existing_col2") "existing_col3") Aber das neue Feld 'new_col', das ich hinzufüge, wird für alle Zeilen null. – Ramesh

+0

Wenn Sie partitionby zwei Spalten tun, dann haben Sie Daten pro Tupel sortiert. Wenn nur ein Wert pro Tupel vorhanden ist, erhalten Sie null (da es keine Verzögerung gibt). Da Sie versuchen, die Verzögerung für Spalte "existing_col2" zu finden, würde ich tun: Window.partitionBy ("existing_col2"). OrderBy ("existing_col1") –

Verwandte Themen