gpt4 book ai didi

apache-spark - Spark SQL : apply aggregate functions to a list of columns

转载 作者:行者123 更新时间:2023-12-03 05:32:07 29 4
gpt4 key购买 nike

在执行groupBy时,有没有办法将聚合函数应用于数据帧的所有(或列表)列?换句话说,有没有办法避免对每一列都这样做:

df.groupBy("col1")
.agg(sum("col2").alias("col2"), sum("col3").alias("col3"), ...)

最佳答案

有多种方法可以将聚合函数应用于多个列。

GroupedData 类提供了许多最常用函数的方法,包括 countmaxminmeansum,可以直接使用,如下:

  • Python:

    df = sqlContext.createDataFrame(
    [(1.0, 0.3, 1.0), (1.0, 0.5, 0.0), (-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2)],
    ("col1", "col2", "col3"))

    df.groupBy("col1").sum()

    ## +----+---------+-----------------+---------+
    ## |col1|sum(col1)| sum(col2)|sum(col3)|
    ## +----+---------+-----------------+---------+
    ## | 1.0| 2.0| 0.8| 1.0|
    ## |-1.0| -2.0|6.199999999999999| 0.7|
    ## +----+---------+-----------------+---------+
  • 斯卡拉

    val df = sc.parallelize(Seq(
    (1.0, 0.3, 1.0), (1.0, 0.5, 0.0),
    (-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2))
    ).toDF("col1", "col2", "col3")

    df.groupBy($"col1").min().show

    // +----+---------+---------+---------+
    // |col1|min(col1)|min(col2)|min(col3)|
    // +----+---------+---------+---------+
    // | 1.0| 1.0| 0.3| 0.0|
    // |-1.0| -1.0| 0.6| 0.2|
    // +----+---------+---------+---------+

您可以选择传递应聚合的列列表

df.groupBy("col1").sum("col2", "col3")

您还可以传递字典/映射,其中列a作为键和函数作为值:

  • Python

    exprs = {x: "sum" for x in df.columns}
    df.groupBy("col1").agg(exprs).show()

    ## +----+---------+
    ## |col1|avg(col3)|
    ## +----+---------+
    ## | 1.0| 0.5|
    ## |-1.0| 0.35|
    ## +----+---------+
  • 斯卡拉

    val exprs = df.columns.map((_ -> "mean")).toMap
    df.groupBy($"col1").agg(exprs).show()

    // +----+---------+------------------+---------+
    // |col1|avg(col1)| avg(col2)|avg(col3)|
    // +----+---------+------------------+---------+
    // | 1.0| 1.0| 0.4| 0.5|
    // |-1.0| -1.0|3.0999999999999996| 0.35|
    // +----+---------+------------------+---------+

最后你可以使用可变参数:

  • Python

    from pyspark.sql.functions import min

    exprs = [min(x) for x in df.columns]
    df.groupBy("col1").agg(*exprs).show()
  • 斯卡拉

    import org.apache.spark.sql.functions.sum

    val exprs = df.columns.map(sum(_))
    df.groupBy($"col1").agg(exprs.head, exprs.tail: _*)

还有一些其他方法可以达到类似的效果,但这些在大多数情况下应该足够了。

另请参阅:

关于apache-spark - Spark SQL : apply aggregate functions to a list of columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33882894/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com