Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memilih Baris Pertama daripada Setiap Kumpulan dalam Spark DataFrame?

Bagaimana untuk Memilih Baris Pertama daripada Setiap Kumpulan dalam Spark DataFrame?

Barbara Streisand
Barbara Streisandasal
2025-01-23 13:12:14454semak imbas

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

Pemilihan baris pertama dalam DataFrame berkumpulan

Apabila bekerja dengan set data kompleks dalam Spark, anda selalunya perlu memilih baris tertentu daripada setiap kumpulan berdasarkan kriteria tertentu. Senario biasa ialah memilih baris pertama daripada setiap kumpulan dan mengisih mengikut lajur tertentu.

Untuk memilih baris pertama daripada setiap kumpulan DataFrame, beberapa kaedah boleh digunakan:

Fungsi tetingkap:

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

Penggabungan dan gabungan SQL yang mudah:

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

Isih struktur:

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

API Set Data:

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 atau lebih tinggi:

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

Kaedah ini menyediakan pelbagai cara untuk memilih baris pertama daripada setiap kumpulan berdasarkan kriteria pengisihan yang ditentukan. Pilihan kaedah bergantung pada keperluan khusus dan pertimbangan prestasi.

Atas ialah kandungan terperinci Bagaimana untuk Memilih Baris Pertama daripada Setiap Kumpulan dalam Spark DataFrame?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn