Sé libre de divulgar nuestra web y códigos en tus redes sociales, apóyanos para hacer crecer nuestra comunidad.
Solución:
Chispa 1.6+
Puedes usar stddev_pop
para calcular la desviación estándar de la población y stddev
/ stddev_samp
para calcular la desviación estándar de la muestra imparcial:
import org.apache.spark.sql.functions.stddev_samp, stddev_pop
selectedData.groupBy($"user").agg(stdev_pop($"duration"))
Chispa 1.5 y menos (la respuesta original):
No tan bonito y sesgado (igual que el valor devuelto por describe
) pero usando la fórmula:
puedes hacer algo como esto:
import org.apache.spark.sql.functions.sqrt
selectedData
.groupBy($"user")
.agg((sqrt(
avg($"duration" * $"duration") -
avg($"duration") * avg($"duration")
)).alias("duration_sd"))
Por supuesto, puede crear una función para reducir el desorden:
import org.apache.spark.sql.Column
def mySd(col: Column): Column =
sqrt(avg(col * col) - avg(col) * avg(col))
df.groupBy($"user").agg(mySd($"duration").alias("duration_sd"))
También es posible utilizar Hive UDF:
df.registerTempTable("df")
sqlContext.sql("""SELECT user, stddev(duration)
FROM df
GROUP BY user""")
Fuente de la imagen: https://en.wikipedia.org/wiki/Standard_deviation
El código aceptado no se compila, ya que tiene un error tipográfico (como lo señaló MRez). El fragmento a continuación funciona y está probado.
Para chispa 2,0 + :
import org.apache.spark.sql.functions._
val _avg_std = df.groupBy("user").agg(
avg(col("duration").alias("avg")),
stddev(col("duration").alias("stdev")),
stddev_pop(col("duration").alias("stdev_pop")),
stddev_samp(col("duration").alias("stdev_samp"))
)
Aquí puedes ver las comentarios y valoraciones de los usuarios
Tienes la opción de añadir valor a nuestro contenido informacional asistiendo con tu experiencia en los comentarios.