Pyspark - 一次聚合数据框的所有列[重复]

Posted

技术标签:

【中文标题】Pyspark - 一次聚合数据框的所有列[重复]【英文标题】:Pyspark - Aggregate all columns of a dataframe at once [duplicate] 【发布时间】:2019-10-08 22:33:31 【问题描述】:

我想在单个列上对数据框进行分组,然后在所有列上应用聚合函数。

例如,我有一个 10 列的 df。我希望对第一列“1”进行分组,然后在所有剩余的列上应用聚合函数“sum”(都是数字)。

R 等价于 summarise_all。 前 R.

df = df%>%group_by(column_one)%>%summarise_all(funs(sum))

我不想在 pyspark 的聚合命令中手动输入列,因为数据框中的列数是动态的。

【问题讨论】:

【参考方案1】:

以下是 pyspark 的示例:

df = spark.createDataFrame([(1,10,20,30),(1,10,20,30),(1,10,20,30)],['id','value1','value2','value3'])

exprs = x: "sum" for x in df.columns if x is not df.columns[0]

df.groupBy("id").agg(exprs).show()

#+---+-----------+-----------+-----------+
#| id|sum(value2)|sum(value1)|sum(value3)|
#+---+-----------+-----------+-----------+
#|  1|         60|         30|         90|
#+---+-----------+-----------+-----------+

这里df.columns[0] 代表df 的第一列。您还可以按名称指定 groupBy 列,如下所示。

exprs = x: "sum" for x in df.columns if x is not 'id'

【讨论】:

【参考方案2】:

如果我要在 spark scala 中这样做,我会使用列名并定义如下聚合函数:

val df = List(("a", 1,2,3), ("a", 4,4,4)).toDF("id", "a", "b", "c")

// Note: df.columns.tail returns Array(a, b, c)
val aggs = df.columns.tail.map(_ -> "sum").toMap
//aggs: scala.collection.immutable.Map[String,String] = Map(a -> sum, b -> sum, c -> sum)

// Group by and execute aggregates:
df.groupBy($"id").agg(aggs).show
+---+------+------+------+
| id|sum(a)|sum(b)|sum(c)|
+---+------+------+------+
|  a|     5|     6|     7|
+---+------+------+------+

另一种选择是在所有指定的列名称上运行相同的sum

df.groupBy($"id").sum(df.columns.tail: _*).show()  // to python users, :_* is a scala operator used to expand a list into a vararg

注意:您可能对此文档感兴趣: https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.RelationalGroupedDataset

【讨论】:

以上是关于Pyspark - 一次聚合数据框的所有列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将pyspark数据框的列转换为小写

在pyspark数据框的列中使用正则表达式捕获两个字符串之间的第一次出现的字符串

如何在数据框的开头移动 pyspark 数据框的特定列

具有多列的数据框的不同聚合

带有点“。”的数据框的 pyspark 访问列

pyspark数据框的区分大小写的列删除操作?