首页 > 解决方案 > Spark SQL 惰性计数

问题描述

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

这就是我正在做的事情:

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,因为它将立即进行评估。

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

有没有办法对数据帧执行惰性计数?

标签: scalaapache-spark

解决方案


而不是使用Dataset.count你可以使用简单的查询

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

然后crossJoin

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

推荐阅读