Pyspark-一次聚合一个数据框的所有列

时间:2019-05-22 12:25:53

标签: r apache-spark pyspark aggregate-functions

我想将一个数据框归为一列,然后将聚合函数应用于所有列。

例如,我有一个包含10列的df。我希望对第一列“ 1”进行分组,然后对其余所有列(均为数字)应用聚合函数“ sum”。

R的等效项是summarise_all。 R中的Ex。

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

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

2 个答案:

答案 0 :(得分: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'}

答案 1 :(得分:0)

如果要在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