如何计算数据框列的平均值并找到前 10%

数据挖掘 阿帕奇火花 斯卡拉
2021-09-15 02:01:13

我对 Scala 和 Spark 非常陌生,并且正在使用棒球统计数据进行一些自制练习。我正在使用案例类创建 RDD 并为数据分配模式,然后将其转换为 DataFrame,以便我可以使用 SparkSQL 通过符合特定条件的统计数据来选择玩家组。

一旦我有了我有兴趣进一步研究的玩家子集,我想找到一个列的平均值;例如击球平均数或 RBI。从那里我想根据他们与所有玩家相比的平均表现将所有玩家分成百分位数组;前 10%、后 10%、40-50%

我已经能够使用 DataFrame.describe() 函数将所需列(平均值、标准差、计数、最小值和最大值)的摘要全部作为字符串返回。有没有更好的方法来获得双打的平均值和标准差,以及将玩家分成 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  
2个回答

这是您需要的导入,以及如何获取名为“RBI”的列的平均值:

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

对于标准偏差,请参阅 scala - 计算 Spark DataFrame 中分组数据的标准偏差 - 代码日志

对于按百分位数分组,我建议通过用户定义函数 (UDF) 定义一个新列,并在该列上使用 groupBy。

这也是返回列的平均值

df.select(mean(df("ColumnName"))).show()
+----------------+
| 平均(列名)|
+----------------+
|230.522453845909|
+----------------+