Heim > Datenbank > MySQL-Tutorial > Wie wähle ich die erste Zeile aus jeder Gruppe in einem Spark-DataFrame aus?

Wie wähle ich die erste Zeile aus jeder Gruppe in einem Spark-DataFrame aus?

Barbara Streisand
Freigeben: 2025-01-23 13:12:14
Original
455 Leute haben es durchsucht

How to Select the First Row from Each Group in a Spark DataFrame?

Auswahl der ersten Zeile im gruppierten DataFrame

Wenn Sie in Spark mit komplexen Datensätzen arbeiten, müssen Sie häufig anhand bestimmter Kriterien bestimmte Zeilen aus jeder Gruppe auswählen. Ein häufiges Szenario besteht darin, die erste Zeile aus jeder Gruppe auszuwählen und nach einer bestimmten Spalte zu sortieren.

Um die erste Zeile aus jeder Gruppe des DataFrame auszuwählen, können mehrere Methoden verwendet werden:

Fensterfunktion:

<code>import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

// 创建一个带有分组数据的 DataFrame
val df = sc.parallelize(Seq((0, "cat26", 30.9), (0, "cat13", 22.1), (0, "cat95", 19.6), (0, "cat105", 1.3),
  (1, "cat67", 28.5), (1, "cat4", 26.8), (1, "cat13", 12.6), (1, "cat23", 5.3),
  (2, "cat56", 39.6), (2, "cat40", 29.7), (2, "cat187", 27.9), (2, "cat68", 9.8),
  (3, "cat8", 35.6))).toDF("Hour", "Category", "TotalValue")

// 创建窗口规范
val w = Window.partitionBy($"Hour").orderBy($"TotalValue".desc)

// 计算每个组的行号
val dfTop = df.withColumn("rn", row_number.over(w)).where($"rn" === 1).drop("rn")

// 显示每个组的第一行
dfTop.show</code>
Nach dem Login kopieren

Einfache SQL-Aggregationen und Joins:

<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")

dfTopByJoin.show</code>
Nach dem Login kopieren

Struktursortierung:

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

dfTop.show</code>
Nach dem Login kopieren

DataSet-API:

Spark 1.6:

<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)
  .show</code>
Nach dem Login kopieren

Spark 2.0 oder höher:

<code>df.as[Record]
  .groupByKey(_.Hour)
  .reduceGroups((x, y) => if (x.TotalValue > y.TotalValue) x else y)</code>
Nach dem Login kopieren

Diese Methoden bieten mehrere Möglichkeiten, die erste Zeile aus jeder Gruppe basierend auf angegebenen Sortierkriterien auszuwählen. Die Wahl der Methode hängt von den spezifischen Anforderungen und Leistungsaspekten ab.

Das obige ist der detaillierte Inhalt vonWie wähle ich die erste Zeile aus jeder Gruppe in einem Spark-DataFrame aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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