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
Barbara StreisandOriginal
2025-01-23 13:12:14393Durchsuche

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>

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>

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>

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>

Spark 2.0 oder höher:

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

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!

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