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!