聚合函数 在 Spark 中使用 groupBy 计算使用情况



我正在尝试在pySpark中的一行代码中进行多个操作,不确定这是否适用于我的情况。

我的意图是不必将输出另存为新数据帧。

我当前的代码相当简单:

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)

我的目的是在使用groupBy后添加count(),以获得与timePeriod列的每个值匹配的记录计数,打印\显示为输出。

尝试使用groupBy(..).count().agg(..)时,我遇到异常。

有没有办法同时实现 count()agg() .show() 打印,而无需将代码拆分为两行命令,例如:

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

或者更好的是,用于将合并的输出获取到agg.show()输出 - 一个额外的列,用于说明与行值匹配的计数记录数。 例如:

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

count()可以在agg()内部使用groupBy因为表达式是相同的。

使用蟒蛇

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)

pySpark SQL functions doc

与斯卡拉

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)将按第一列计算记录,该列等于 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)

相关内容

  • 没有找到相关文章

最新更新