Spark请求avg with count

时间:2016-11-26 21:11:31

标签: python apache-spark pyspark

我想要求平均找到本周最繁忙的一天。

我的数据框上有一个字段日(星期一,星期二......)。

我的要求如下:

mostBusyDayDF = logDF.groupBy("day_week")
  .agg(functions.count("day_week").alias("cntDay"))
  .groupBy("cntDay").agg(functions.avg("cntDay").alias("avgDay"))
  .orderBy(functions.desc("avgDay")).limit(1).show()

结果是所有计数总和的平均值,但我希望每天都有平均值。

例如:

我的输入

day_week
  Monday
  Tuesday
  Monday
  Monday

我想输出

day_week       count()        avg()
  Monday            1          1/(1+2+4+2)
  Tuesday           2          2/(1+2+4+2)
  Monday            4          4/(1+2+4+2)
  Monday            2          2/(1+2+4+2)

如何解决我的问题?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您需要首先对列数进行求和,并且有很多方法可以做到这一点,例如:

sum_count = logDF.count() 

一旦你得到这笔钱,就可以用你的小组来除以总和,例如:

mostBusyDayDF = logDF.groupBy("day_week")
       .agg(functions.count("day_week").alias("cntDay"))
       .withColumn("avgDay" , col("cntDay") / functions.lit(sum_count))
mostBusyDayDF.show()

注意: lit会创建一个字面值列。