DataFrame / Dataset groupBy-Verhalten/ - Optimierung
Nehmen wir an, wir haben DataFrame df
bestehend aus den folgenden Spalten:
Name, Vorname, Größe, Breite, Länge, Wiegen
Wollen wir jetzt führen Sie ein paar Operationen, zum Beispiel erstellen wir ein paar DataFrames mit Angaben über Größe und Breite.
val df1 = df.groupBy("surname").agg( sum("size") )
val df2 = df.groupBy("surname").agg( sum("width") )
wie Sie sehen können, die anderen Säulen, wie die Länge werden nicht überall eingesetzt. Ist Spark smart genug, um Tropfen, die redundanten Spalten, bevor die schlurfenden phase oder sind Sie mit sich herumgeschleppt? Wil läuft:
val dfBasic = df.select("surname", "size", "width")
bevor Gruppierung irgendwie beeinflussen die Leistung?
- Funke wählt die Spalten, die er bat, ihm von auf. Können Sie das erklären, um den physischen plan zu Ihrer Abfrage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist "smart genug".
groupBy
durchgeführtDataFrame
ist nicht der gleiche Vorgang wiegroupBy
durchgeführt, die auf einer Ebene RDD. In einem Szenario, das Sie beschrieben haben gibt es keine Notwendigkeit, verschieben von raw-Daten. Lassen Sie uns ein kleines Beispiel zur illustration:Als Sie die erste phase ist eine Projektion, wo nur die gewünschten Spalten erhalten. Nächste Daten lokal aggregiert und schließlich übertragen und gesammelt weltweit. Sie erhalten eine etwas andere Antwort ausgegeben, wenn Sie verwenden Funke <= 1,4, aber die Allgemeine Struktur sollte identisch sein.
Schließlich ein DAG-Visualisierung zeigt, dass die obige Beschreibung beschreibt die eigentliche Arbeit:
Ebenso
Dataset.groupByKey
gefolgt vonreduceGroups
enthält sowohl map-Seite (ObjectHashAggregate
mitpartial_reduceaggregator
) und verringern Sie-Seite (ObjectHashAggregate
mitreduceaggregator
Reduktion):Jedoch andere Methoden der
KeyValueGroupedDataset
könnte funktionieren ähnlich wieRDD.groupByKey
. Zum BeispielmapGroups
(oderflatMapGroups
) nicht mit der partiellen aggregation.