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
count()
peut être utilisé à l'intérieur de agg()
comme groupBy
expression est la même.
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)
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")
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)