web-dev-qa-db-fra.com

fonction d'agrégation Compter l'utilisation avec groupBy dans Spark

J'essaie de créer plusieurs opérations dans une seule ligne de code dans pySpark, mais je ne suis pas sûr que ce soit possible dans mon cas.

Mon intention est de ne pas avoir à enregistrer la sortie en tant que nouvelle trame de données.

Mon code actuel est plutôt simple:

encodeUDF = udf(encode_time, StringType())
new_log_df.cache().withColumn('timePeriod', encodeUDF(col('START_TIME')))
  .groupBy('timePeriod')
  .agg(
    mean('DOWNSTREAM_SIZE').alias("Mean"),
    stddev('DOWNSTREAM_SIZE').alias("Stddev")
  )
  .show(20, False)

Et mon intention est d’ajouter count() après avoir utilisé groupBy pour obtenir le nombre d’enregistrements correspondant à chaque valeur de timePeriod colonne, imprimé\affiché en sortie.

Lorsque j'essaie d'utiliser groupBy(..).count().agg(..), je reçois des exceptions.

Existe-t-il un moyen d'obtenir à la fois count() et agg(). Show () imprime, sans scinder le code en deux lignes de commandes, par ex. :

new_log_df.withColumn(..).groupBy(..).count()
new_log_df.withColumn(..).groupBy(..).agg(..).show()

Ou mieux encore, pour obtenir une sortie fusionnée dans agg.show() sortie - Une colonne supplémentaire qui indique le nombre compté d'enregistrements correspondant à la valeur de la ligne. par exemple.:

timePeriod | Mean | Stddev | Num Of Records
    X      | 10   |   20   |    315
29
Adiel

count() peut être utilisé à l'intérieur de agg() comme groupBy expression est la même.

Avec python

import pyspark.sql.functions as func

new_log_df.cache().withColumn("timePeriod", encodeUDF(new_log_df["START_TIME"])) 
  .groupBy("timePeriod")
  .agg(
     func.mean("DOWNSTREAM_SIZE").alias("Mean"), 
     func.stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     func.count(func.lit(1)).alias("Num Of Records")
   )
  .show(20, False)

doc de fonctions pySpark SQL

Avec Scala

import org.Apache.spark.sql.functions._ //for count()

new_log_df.cache().withColumn("timePeriod", encodeUDF(col("START_TIME"))) 
  .groupBy("timePeriod")
  .agg(
     mean("DOWNSTREAM_SIZE").alias("Mean"), 
     stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     count(lit(1)).alias("Num Of Records")
   )
  .show(20, false)

count(1) comptera les enregistrements par première colonne qui est égale à count("timePeriod")

Avec java

import static org.Apache.spark.sql.functions.*;

new_log_df.cache().withColumn("timePeriod", encodeUDF(col("START_TIME"))) 
  .groupBy("timePeriod")
  .agg(
     mean("DOWNSTREAM_SIZE").alias("Mean"), 
     stddev("DOWNSTREAM_SIZE").alias("Stddev"),
     count(lit(1)).alias("Num Of Records")
   )
  .show(20, false)
52
mrsrinivas