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
Susan SarandonOriginal
2025-01-23 12:57:101020Durchsuche

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>

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>

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>

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>

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!

Stellungnahme:
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