scala - 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
,因为它将立即进行评估。
累加器无济于事,因为它们将被提前评估。
有没有办法对数据帧执行惰性计数?
解决方案
而不是使用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")
推荐阅读
- amazon-web-services - Gmail API 身份验证重定向在 AWS EC2 上不起作用
- android - SharedPreference 记住复选框是可见和选中的
- ios - TableView中的动态collectionView
- html - 为什么我的文字周围有空白?它不在 freecodecamp 示例中。非常基础的 CSS/HTML
- r - 闪亮的搜索输入
- python - 从列表中访问元素?
- java - 如何在 Java 11 中设置 HashMap final 的键值对?
- python - 烧瓶运行没有运行并给我错误
- ffmpeg - ffmpeg 桌面捕获会丢弃音频帧但不会丢弃视频
- javascript - JavaScript es 6 将 Map 转换为 json 对象数组