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
sumber
.agg(avg(people("salary")), max(people("age")))
. Dengan penyortiran Anda mungkin dapat menemukan (menggunakanskip
dantake
) persentil, tetapi mungkin ada opsi yang lebih cepat.not found: value avg
dannot found: value max
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.joda.time.format.DateTimeFormat
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.)Jawaban:
Ini adalah impor yang Anda butuhkan, dan cara mendapatkan rata-rata untuk kolom bernama "RBI":
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
sumber
Ini juga mengembalikan rata-rata kolom
sumber