Mendapatkan TopN untuk Setiap Kumpulan dalam DataFrame
Dalam Spark DataFrame, kita selalunya perlu mengumpulkan data mengikut lajur tertentu dan mendapatkan bahagian atas N rekod daripada setiap kumpulan. Contohnya, anda mempunyai DataFrame dengan data penilaian item pengguna dan anda ingin mencari item yang dinilai paling tinggi untuk setiap pengguna.
Scala Solution
The Scala penyelesaian kepada masalah ini melibatkan penggunaan fungsi tetingkap pangkat. Begini cara anda boleh melakukannya:
Tentukan nilai N teratas:
val n: Int = ???
Buat definisi tetingkap untuk membahagikan data oleh pengguna lajur dan susun rekod mengikut susunan menurun penilaian:
val w = Window.partitionBy($"user").orderBy(desc("rating"))
Tambahkan lajur kedudukan pada DataFrame menggunakan fungsi pangkat:
df.withColumn("rank", rank().over(w))
Tapis DataFrame untuk disimpan sahaja rekod N teratas daripada setiap satu kumpulan:
df.where($"rank" <= n)
Alternatif dengan Nombor Baris
Jika anda tidak perlu memutuskan hubungan, anda boleh menggunakan fungsi row_number sebaliknya daripada fungsi pangkat. Ini akan memberi anda nombor baris unik untuk setiap rekod dalam setiap kumpulan:
df.withColumn("row_number", row_number().over(w))
Anda kemudiannya boleh menapis DataFrame untuk menyimpan hanya rekod N teratas daripada setiap kumpulan menggunakan kriteria yang sama seperti sebelum ini.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod N Teratas untuk Setiap Kumpulan dalam Spark DataFrame?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!