关于Scala:Spark SQL惰性计数

Spark SQL lazy count

我需要使用数据帧计数作为除数来计算百分比。

这就是我在做什么:

1
2
3
4
scala> val df = Seq(1,1,1,2,2,3).toDF("value")
scala> val overallCount = df.count
scala> df.groupBy("value")
         .agg( count(lit(1)) / overallCount )

但是我想避免执行操作df.count,因为它将立即进行评估。

累加器将无济于事,因为它们将被预先评估。

是否可以对数据帧执行延迟计数?


代替使用Dataset.count,您可以使用简单的查询

1
val overallCount = df.select(count($"*") as"overallCount")

和更高版本的crossJoin

1
2
3
4
5
df
  .groupBy("value")
  .agg(count(lit(1)) as"groupCount")
  .crossJoin(overallCount)
  .select($"value", $"groupCount" / $"overallCount")