我有以下数据框,我希望按ID进行汇总,并对每个唯一ID的“值”列求和:
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|
+---+-----+----------+
是否可以通过编程方式执行此操作?
答案 0 :(得分:2)
方法是使用聚合函数。 Sparks附带了许多预定义的变量(平均值,总和,计数,第一,收集列表,收集集合,最小,最大等),因此您始终可以在示例中按以下方式进行操作:
$nr
通过查看定义为“聚合函数”的函数,可以查看sql.function package documentation内部的已定义函数。如果您使用的是面向SQL的语法,那么所有这些语言都具有等效的SQL语法。