我有以下Dataframe,我希望按ID汇总,并为每个唯一ID总和'value'列:
import org.apache.spark.sql.functions._
import spark.implicits._
// some data...
val df = Seq(
(1, 2),
(1, 4),
(1, 1),
(2, 2),
(2, 2),
(3, 2),
(3, 1),
(3, 1)
).toDF("id","value")
df.show()
给出以下内容:
id | value |
---|---|
1 | 2 |
1 | 4 |
1 | 1 |
2 | 2 |
2 | 2 |
3 | 2 |
3 | 1 |
3 | 1 |
使用计数功能我知道我可以计算唯一的ID:
df.select("id").groupBy($"id").count.orderBy($"id".asc).show()
id | count |
---|---|
1 | 3 |
2 | 2 |
3 | 3 |
但我也希望对每个唯一ID的值求和(或得到平均值)。所以结果表应该如下:
id | count | valueCount |
---|---|---|
1 | 3 | 7 |
2 | 2 | 4 |
3 | 3 | 4 |
有没有办法以编程方式执行此操作?
这样做的方法是使用聚合函数。Sparks带有许多预定义的(平均值,总和,计数,第一个,收集列表,收集集,最小值,最大值......),所以你可以随时在你的例子中这样做:
df.groupBy("id").agg(
count("id").as("countOfIds"),
sum("id").as("sumOfIds"),
avg("id").as("avgOfIds")
).show | |||
---|---|---|---|
id | countOfIds | sumOfIds | avgOfIds |
1 | 3 | 3 | 1.0 |
3 | 3 | 9 | 3.0 |
2 | 2 | 4 | 2.0 |
您可以通过查看定义为“聚合函数”的函数来查看sql.function包文档中定义的函数。如果您使用面向SQL的语法,所有这些都具有等效的SQL语法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。