如何计算并获取Spark数据框中唯一ID的价值总和?

时间:2018-11-20 13:14:11

标签: apache-spark dataframe

我有以下数据框,我希望按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|
+---+-----+----------+

是否可以通过编程方式执行此操作?

1 个答案:

答案 0 :(得分:2)

方法是使用聚合函数。 Sparks附带了许多预定义的变量(平均值,总和,计数,第一,收集列表,收集集合,最小,最大等),因此您始终可以在示例中按以下方式进行操作:

$nr

通过查看定义为“聚合函数”的函数,可以查看sql.function package documentation内部的已定义函数。如果您使用的是面向SQL的语法,那么所有这些语言都具有等效的SQL语法。