Angenommen, DataFrame df
besteht aus den folgenden Spalten:
Name, Nachname, Größe, Breite, Länge, Wiegen
Nun möchten wir ein paar Operationen ausführen, zum Beispiel wollen wir ein paar Datenrahmen erstellen, die Daten über Größe und Breite enthalten.
%Vor%Wie Sie sehen können, werden andere Spalten wie Länge nicht verwendet. Ist Spark intelligent genug, um die redundanten Spalten vor der Shuffling-Phase fallen zu lassen oder werden sie herumgetragen? Wil läuft:
%Vor%vor der Gruppierung beeinflussen irgendwie die Leistung?
Ja, es ist " intelligent genug ". groupBy
für DataFrame
ist nicht die gleiche Operation wie groupBy
für eine einfache RDD. In einem von Ihnen beschriebenen Szenario müssen keine Rohdaten verschoben werden. Lassen Sie uns ein kleines Beispiel erstellen, um dies zu veranschaulichen:
Wie Sie sehen können, ist die erste Phase eine Projektion, bei der nur erforderliche Spalten erhalten bleiben. Die nächsten Daten werden lokal aggregiert und schließlich global übertragen und aggregiert. Sie erhalten eine etwas andere Antwortausgabe, wenn Sie Spark & lt; = 1.4 verwenden, aber die allgemeine Struktur sollte genau gleich sein.
Schließlich eine DAG-Visualisierung, die zeigt, dass obige Beschreibung den eigentlichen Job beschreibt:
Gleichermaßen enthält Dataset.groupByKey
, gefolgt von reduceGroups
, sowohl map-side ( ObjectHashAggregate
mit partial_reduceaggregator
) als auch reduction-side ( ObjectHashAggregate
mit reduceaggregator
reduzierung):
Allerdings können andere Methoden von KeyValueGroupedDataset
ähnlich wie RDD.groupByKey
funktionieren. Zum Beispiel verwendet mapGroups
(oder flatMapGroups
) keine partielle Aggregation.
Tags und Links performance apache-spark dataframe spark-dataframe apache-spark-sql