【问题标题】:Spark SQL lazy countSpark SQL 惰性计数
【发布时间】:2019-09-01 19:35:24
【问题描述】:

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

这就是我正在做的:

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,我正在构建几个数据帧,我希望它们仅在使用时被评估(和缓存)。

标签: scala apache-spark


【解决方案1】:

你可以使用简单查询来代替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")

【讨论】:

  • 正是我想要的。但似乎crossJoin 正在触发评估。
  • @PedroH 绝对不是一个人(使用the same methods I described here 进行测试。但在某些情况下,Spark 可能必须再次确定分区数,尽管我想不出这里可能需要的任何特定情况。但是如果是这种情况,您可以随时将相应的vals 标记为lazy)。
  • 即使使用lazy vals,Spark 也会在使用时评估vals:```lazy valoverallCountDF = df.select(count($"*") as "overallCount") ... .crossJoin(overallCountDF) //
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
相关资源
最近更新 更多