Como calcular a média de uma coluna de quadro de dados e encontrar os 10% principais

13

Sou muito novo no Scala e no Spark e estou trabalhando em alguns exercícios criados usando estatísticas de beisebol. Estou usando uma classe de caso, crie um RDD e atribua um esquema aos dados, e depois o transformei em um DataFrame para que eu possa usar o SparkSQL para selecionar grupos de jogadores por meio de suas estatísticas que atendam a certos critérios.

Depois de ter o subconjunto de jogadores que estou interessado em analisar mais adiante, gostaria de encontrar a média de uma coluna; por exemplo, Média de rebatidas ou RBIs. A partir daí, gostaria de dividir todos os jogadores em grupos de percentis com base no desempenho médio em comparação com todos os jogadores; os 10% superiores, 10% inferiores, 40-50%

Consegui usar a função DataFrame.describe () para retornar um resumo de uma coluna desejada (média, stddev, count, min e max), tudo como strings. Existe uma maneira melhor de obter apenas a média e o stddev como Pares, e qual é a melhor maneira de dividir os jogadores em grupos de 10%?

Até agora, meus pensamentos são encontrar os valores que marcam os intervalos percentuais e escrever uma função que agrupe os jogadores por meio de comparadores, mas parece que isso está prestes a reinventar a roda.

Atualmente, tenho as seguintes importações:

 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
fonte
Você verificou o scaladoc ? Tem um exemplo para média e máx: .agg(avg(people("salary")), max(people("age"))). Com a classificação, você provavelmente pode encontrar (usando skipe take) os percentis, mas pode haver opções mais rápidas.
Gábor Bakos
Eu já tinha visto isso anteriormente nos scaladocs. Quando tento usá-los como no exemplo que recebo e erro not found: value avgenot found: value max
the3rdNotch
Quais são as suas importações? Pode ser mais fácil ajudar se houver um exemplo e você descrever qual foi o problema.
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
O teste a seguir pode ajudar a começar a usar as funções do DataFrame. Parece que você também precisa importar o org.apache.spark.sql.functions._. (BTW .: Eu acho que a informação adicional é melhor adicionado à própria questão e é suficiente para adicionar um comentário após edição.)
Gábor Bakos

Respostas:

21

Esta é a importação de que você precisa e como obter a média para uma coluna chamada "RBIs":

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

Para o desvio padrão, consulte scala - Calcular o desvio padrão de dados agrupados em um Spark DataFrame - Stack Overflow

Para agrupar por percentis, sugiro definir uma nova coluna por meio de uma função definida pelo usuário (UDF) e usar groupBy nessa coluna. Vejo

nealmcb
fonte
4

Isso também retorna a média da coluna

df.select (média (df ("ColumnName")))). show ()
+ ---------------- +
| média (nome da coluna) |
+ ---------------- +
| 230.522453845909 |
+ ---------------- +
Erkan ŞİRİN
fonte