Heim > Datenbank > MySQL-Tutorial > Wie wähle ich effizient die oberste Zeile für jede Gruppe in Spark aus?

Wie wähle ich effizient die oberste Zeile für jede Gruppe in Spark aus?

Susan Sarandon
Freigeben: 2025-01-23 12:57:10
Original
969 Leute haben es durchsucht

How to Efficiently Select the Top Row for Each Group in Spark?

Wählen Sie effizient die erste Zeile jeder Gruppe aus

Ziel dieses Artikels ist es, die Datenzeile mit dem höchsten „Gesamtwert“ in jeder „Stunde“- und „Kategorie“-Gruppierung zu extrahieren. Dafür gibt es mehrere Möglichkeiten:

Fensterfunktionen verwenden:

Fensterfunktionen bieten eine effiziente Möglichkeit, Berechnungen innerhalb jeder Gruppierung durchzuführen. Hier ist eine Möglichkeit:

<code>import org.apache.spark.sql.functions.{row_number, max, broadcast}
import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy($"Hour").orderBy($"TotalValue".desc)

val dfTop = df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop("rn")</code>
Nach dem Login kopieren

Verwendung von SQL-Aggregationen und Joins:

Ein anderer Ansatz besteht darin, SQL-Aggregation und nachfolgende Verknüpfungen zu nutzen:

<code>val dfMax = df.groupBy($"Hour".as("max_hour")).agg(max($"TotalValue").as("max_value"))

val dfTopByJoin = df.join(broadcast(dfMax),
    ($"Hour" === $"max_hour") && ($"TotalValue" === $"max_value"))
  .drop("max_hour")
  .drop("max_value")</code>
Nach dem Login kopieren

Struktursortierung verwenden:

Eine clevere Möglichkeit besteht darin, eine Struktur zu sortieren, die „Gesamtwert“ und „Kategorie“ enthält:

<code>val dfTop = df.select($"Hour", struct($"TotalValue", $"Category").alias("vs"))
  .groupBy($"Hour")
  .agg(max("vs").alias("vs"))
  .select($"Hour", $"vs.Category", $"vs.TotalValue")</code>
Nach dem Login kopieren

Verwendung der DataSet-API (Spark 1.6):

Die DataSet-API bietet eine übersichtliche Möglichkeit, das gleiche Ergebnis zu erzielen:

<code>case class Record(Hour: Integer, Category: String, TotalValue: Double)

df.as[Record]
  .groupBy($"Hour")
  .reduce((x, y) => if (x.TotalValue > y.TotalValue) x else y)</code>
Nach dem Login kopieren

So vermeiden Sie Fehler:

Die folgenden Methoden können zu unzuverlässigen Ergebnissen führen und sollten vermieden werden:

  • df.orderBy(...).groupBy(...).agg(first(...), ...)
  • df.orderBy(...).dropDuplicates(...)

Das obige ist der detaillierte Inhalt vonWie wähle ich effizient die oberste Zeile für jede Gruppe in Spark aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage