【问题标题】:How to use Sum on groupBy result in Spark DatFrames?如何在 Spark DataFrames 中对 group By 结果使用 Sum?
【发布时间】:2021-05-03 22:01:02
【问题描述】:

基于以下数据框:

+---+-----+----+
| ID|Categ|Amnt|
+---+-----+----+
|  1|    A|  10|
|  1|    A|   5|
|  2|    A|  56|
|  2|    B|  13|
+---+-----+----+

我想获取 Amnt groupby ID 和 Categ 列的总和。

+---+-----+-----+
| ID|Categ|Count|
+---+-----+-----+
|  1|    A|  15 |
|  2|    A|  56 |
|  2|    B|  13 |
+---+-----+-----+

在 SQL 中我会做类似的事情

SELECT ID,
       Categ, 
       SUM (Count) 
FROM Table 
GROUP BY ID,
         Categ;

但是如何在 Scala 中做到这一点? 我试过了

DF.groupBy($"ID", $"Categ").sum("Count")

但这只是将 Count 列名称更改为 sum(count),而不是实际给我计数的总和。

【问题讨论】:

  • 你必须使用聚合并使用别名df.groupBy("ID", "Categ").agg(sum("Amnt").as("Count")),当然你需要import org.apache.spark.sql.functions.sum :)
  • @RameshMaharjan 的解决方案对我有用,但下面的解决方案没有。
  • @Amr A.,对于复杂的聚合(例如多个聚合)或重命名聚合列,需要用 agg 包装聚合。请参阅我的扩展答案。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

也许你对错误的列求和,但你的 grougBy/sum 语句在我看来在语法上是正确的:

val df = Seq(
  (1, "A", 10),
  (1, "A", 5),
  (2, "A", 56),
  (2, "B", 13)
).toDF("ID", "Categ", "Amnt")

df.groupBy("ID", "Categ").sum("Amnt").show
// +---+-----+---------+                                                           
// | ID|Categ|sum(Amnt)|
// +---+-----+---------+
// |  1|    A|       15|
// |  2|    A|       56|
// |  2|    B|       13|
// +---+-----+---------+

编辑:

要为 sum(Amnt) 列设置别名(或者,对于多个聚合),请使用 agg 包装聚合表达式。例如:

// Rename `sum(Amnt)` as `Sum`
df.groupBy("ID", "Categ").agg(sum("Amnt").as("Sum"))

// Aggregate `sum(Amnt)` and `count(Categ)`
df.groupBy("ID", "Categ").agg(sum("Amnt"), count("Categ"))

【讨论】:

  • 初学者别忘了导入org.apache.spark.sql.functions._
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多