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  

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


4

Isso também retorna a média da coluna

df.select (média (df ("ColumnName")))). show ()
+ ---------------- +
| média (nome da coluna) |
+ ---------------- +
| 230.522453845909 |
+ ---------------- +
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.