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,因为它将立即进行评估。
累加器将无济于事,因为它们将被预先评估。
是否可以对数据帧执行延迟计数?
- 通过不立即执行操作,您想获得什么?
-
@Shaido,我正在构造几个数据帧,我希望仅在使用它们时对其进行评估(和缓存)。
代替使用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") |
- 正是我想要的。但是crossJoin似乎正在触发评估。
-
@PedroH绝对不孤单(使用我在这里描述的相同方法进行了测试。但是在某些情况下,Spark可能必须确定分区的数量,尽管我无法想到此处可能需要的任何特定情况。但是,如果是这样的话,可以始终将相应的vals标记为lazy)。
-
即使使用lazy vals,Spark在使用时也会评估vals:```lazy val totalCountDF = df.select(count($" *")as" overallCount")... .crossJoin(overallCountDF)// < -评估```