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
Lepaskan: 2025-01-23 13:12:14
asal
438 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Spark 2.0 atau lebih tinggi:

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

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan