Cara menghitung rata-rata kolom dataframe dan menemukan 10% teratas

13

Saya sangat baru di Scala dan Spark, dan sedang mengerjakan beberapa latihan buatan sendiri menggunakan statistik bisbol. Saya menggunakan kelas kasus membuat RDD dan menetapkan skema untuk data, dan kemudian mengubahnya menjadi DataFrame sehingga saya dapat menggunakan SparkSQL untuk memilih kelompok pemain melalui statistik mereka yang memenuhi kriteria tertentu.

Setelah saya memiliki subset pemain yang saya tertarik untuk melihat lebih jauh, saya ingin mencari rata-rata kolom; misalnya Batting Average atau RBIs. Dari sana saya ingin membagi semua pemain menjadi kelompok persentil berdasarkan kinerja rata-rata mereka dibandingkan dengan semua pemain; 10% teratas, 10% terbawah, 40-50%

Saya sudah bisa menggunakan fungsi DataFrame.describe () untuk mengembalikan ringkasan kolom yang diinginkan (rata-rata, stddev, count, min, dan max) semuanya sebagai string. Apakah ada cara yang lebih baik untuk mendapatkan nilai rata-rata dan stddev sebagai Doubles, dan apa cara terbaik untuk memecah pemain menjadi kelompok 10-persentil?

Sejauh ini pikiran saya adalah menemukan nilai-nilai yang mencatat rentang persentil dan menulis fungsi yang mengelompokkan pemain melalui pembanding, tetapi rasanya seperti berbatasan dengan menciptakan kembali roda.

Saya memiliki impor berikut saat ini:

 import org.apache.spark.rdd.RDD 
 import org.apache.spark.sql.SQLContext 
 import org.apache.spark.{SparkConf, SparkContext} 
 import org.joda.time.format.DateTimeFormat  
the3rdNotch
sumber
Sudahkah Anda memeriksa skaladoc ? Ini memiliki contoh untuk rata-rata dan max: .agg(avg(people("salary")), max(people("age"))). Dengan penyortiran Anda mungkin dapat menemukan (menggunakan skipdan take) persentil, tetapi mungkin ada opsi yang lebih cepat.
Gábor Bakos
Saya telah melihat ini sebelumnya di scaladocs. Ketika saya mencoba menggunakannya seperti contoh yang saya terima dan galat not found: value avgdannot found: value max
the3rdNotch
Apa impor Anda? Mungkin lebih mudah untuk membantu jika ada contoh dan Anda menjelaskan apa masalahnya.
Gábor Bakos
import org.apache.spark.rdd.RDD import org.apache.spark.sql.SQLContext import org.apache.spark.{SparkConf, SparkContext} import org.joda.time.format.DateTimeFormat
the3rdNotch
Tes berikut mungkin membantu mulai menggunakan fungsi DataFrame. Sepertinya Anda harus mengimpor org.apache.spark.sql.functions._juga. (BTW .: Saya pikir informasi tambahan lebih baik ditambahkan ke pertanyaan itu sendiri dan cukup untuk menambahkan komentar setelah diedit.)
Gábor Bakos

Jawaban:

21

Ini adalah impor yang Anda butuhkan, dan cara mendapatkan rata-rata untuk kolom bernama "RBI":

import org.apache.spark.sql.functions._
df.select(avg($"RBIs")).show()

Untuk standar deviasi, lihat scala - Hitung standar deviasi data yang dikelompokkan dalam Spark DataFrame - Stack Overflow

Untuk pengelompokan berdasarkan persentil, saya sarankan mendefinisikan kolom baru melalui fungsi yang ditentukan pengguna (UDF), dan menggunakan groupBy pada kolom itu. Lihat

nealmcb
sumber
4

Ini juga mengembalikan rata-rata kolom

df.select (mean (df ("ColumnName")))). show ()
+ ---------------- +
| rata-rata (Nama Kolom) |
+ ---------------- +
| 230.522453845909 |
+ ---------------- +
Erkan ŞİRİN
sumber