データフレーム列の平均を計算し、上位10%を見つける方法


13

私はScalaとSparkを初めて使い、野球の統計を使用した自作のエクササイズに取り組んでいます。ケースクラスを使用してRDDを作成し、データにスキーマを割り当ててから、それをDataFrameに変換して、SparkSQLを使用して特定の条件を満たす統計情報を介してプレーヤーのグループを選択できるようにします。

さらに検討したいプレーヤーのサブセットができたら、列の平均を見つけたいと思います。例:バッティング平均またはRBI。そこから、すべてのプレーヤーと比較した平均パフォーマンスに基づいて、すべてのプレーヤーをパーセンタイルグループに分割します。上位10%、下位10%、40-50%

ただし、DataFrame.describe()関数を使用して、目的の列(mean、stddev、count、min、max)の概要をすべて文字列として返すことができました。ダブルスとして平均値と標準偏差を取得するより良い方法はありますか?また、プレイヤーを10パーセンタイルのグループに分割する最良の方法は何ですか?

これまでのところ、パーセンタイル範囲をブックエンドし、コンパレータを介してプレイヤーをグループ化する関数を記述する値を見つけることですが、それは車輪の再発明に国境を接しているように感じます。

現在、次のインポートがあります。

 import org.apache.spark.rdd.RDD 
 import org.apache.spark.sql.SQLContext 
 import org.apache.spark.{SparkConf, SparkContext} 
 import org.joda.time.format.DateTimeFormat  

scaladocを確認しましたか?平均と最大の例があります.agg(avg(people("salary")), max(people("age")))。ソートを使用するskipと、おそらくを使用して(およびを使用してtake)パーセンタイルを見つけることができますが、より高速なオプションがあるかもしれません。
ガボールバコス

これは以前scaladocsで見たことがあります。私は受信例およびエラーのようにそれらを使用しようとするnot found: value avgnot found: value max
the3rdNotch

輸入品は何ですか?例があり、問題が何であるかを説明すると、助けやすくなります。
ガボールバコス

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

次のテストは、DataFrame関数の使用開始に役立つ場合があります。あなたもインポートする必要があるようですorg.apache.spark.sql.functions._。(ところで:追加の情報は質問自体に追加した方が良いと思うし、編集後にコメントを追加するだけで十分だと思う。)
ガボールバコス

回答:


21

これが必要なインポートであり、「RBI」という名前の列の平均を取得する方法です。

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

標準偏差については、 scala-Spark DataFrameでグループ化されたデータの標準偏差を計算する-スタックオーバーフローを参照してください

パーセンタイルでグループ化するには、ユーザー定義関数(UDF)を介して新しい列を定義し、その列でgroupByを使用することをお勧めします。見る


4

これは列の平均も返します

df.select(mean(df( "ColumnName")))。show()
+ ---------------- +
| avg(ColumnName)|
+ ---------------- +
| 230.522453845909 |
+ ---------------- +
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.