【问题标题】:Calculate mean for several columns in Spark scala计算 Spark scala 中几列的平均值
【发布时间】:2019-10-17 02:21:39
【问题描述】:

我正在寻找一种方法来计算一些统计数据,例如使用 Scala 在 Spark 中的几个选定列上的平均值。鉴于 data 对象是我的 Spark DataFrame,因此很容易仅计算一列的平均值,例如

data.agg(avg("var1") as "mean var1").show

此外,我们可以轻松计算按其他列的值交叉制表的平均值,例如:

data.groupBy("category").agg(avg("var1") as "mean_var1").show

但是我们如何计算 DataFrame 中列列表的平均值呢?我试过运行这样的东西,但没有用:

scala> data.select("var1", "var2").mean().show
<console>:44: error: value mean is not a member of org.apache.spark.sql.DataFrame
       data.select("var1", "var2").mean().show
                                   ^

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    这是你需要做的

    import org.apache.spark.sql.functions._
    
    import spark.implicits._
    val df1 = Seq((1,2,3), (3,4,5), (1,2,4)).toDF("A", "B", "C")
    
    data.select(data.columns.map(mean(_)): _*).show()
    

    输出:

    +------------------+------------------+------+
    |            avg(A)|            avg(B)|avg(C)|
    +------------------+------------------+------+
    |1.6666666666666667|2.6666666666666665|   4.0|
    +------------------+------------------+------+
    

    这适用于选定的列

    data.select(Seq("A", "B").map(mean(_)): _*).show()
    

    输出:

    +------------------+------------------+
    |            avg(A)|            avg(B)|
    +------------------+------------------+
    |1.6666666666666667|2.6666666666666665|
    +------------------+------------------+
    

    希望这会有所帮助!

    【讨论】:

    • 我知道这种方法,但它不正确。它将平均值应用于数据框的所有列。
    • 没错!现在它运行良好。我会接受你的回答。谢谢。
    • 很高兴为您提供帮助 :) 并感谢您接受作为答案
    【解决方案2】:

    如果您已经拥有数据集,您可以这样做:

    ds.describe(s"age")
    

    哪个会返回这个:

        summary age  
        count   10.0 
        mean    53.3   
        stddev  11.6
        min     18.0
        max     92.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2018-03-19
      • 2020-04-18
      相关资源
      最近更新 更多