【问题标题】:How to sum the values of one column of a dataframe in spark/scala如何在 spark/scala 中对数据框的一列的值求和
【发布时间】:2016-08-30 03:28:55
【问题描述】:

我有一个从 CSV 文件中读取的数据框,其中包含许多列,例如:时间戳、步数、心率等。

我想对每一列的值求和,例如“步数”列的总步数。

据我所知,我想使用这些功能: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions$

但我可以理解如何使用函数 sum。

当我写下以下内容时:

val df = CSV.load(args(0))
val sumSteps = df.sum("steps") 

函数 sum 无法解析。

我是否错误地使用了函数 sum? 我需要先使用功能图吗?如果是的话怎么做?

一个简单的例子会很有帮助!我最近开始写 Scala。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    你必须先导入函数:

    import org.apache.spark.sql.functions._
    

    然后你可以像这样使用它们:

    val df = CSV.load(args(0))
    val sumSteps =  df.agg(sum("steps")).first.get(0)
    

    如果需要,您还可以转换结果:

    val sumSteps: Long = df.agg(sum("steps").cast("long")).first.getLong(0)
    

    编辑:

    对于多个列(例如“col1”、“col2”、...),您可以一次获取所有聚合:

    val sums = df.agg(sum("col1").as("sum_col1"), sum("col2").as("sum_col2"), ...).first
    

    编辑2:

    对于动态应用聚合,可以使用以下选项:

    • 一次应用于所有数字列:
    df.groupBy().sum()
    
    • 应用于数字列名列表:
    val columnNames = List("col1", "col2")
    df.groupBy().sum(columnNames: _*)
    
    • 应用于具有别名和/或强制转换的数字列名列表:
    val cols = List("col1", "col2")
    val sums = cols.map(colName => sum(colName).cast("double").as("sum_" + colName))
    df.groupBy().agg(sums.head, sums.tail:_*).show()
    

    【讨论】:

      【解决方案2】:

      如果你想sum一列的所有值,使用DataFrame的内部RDDreduce效率更高。

      import sqlContext.implicits._
      import org.apache.spark.sql.functions._
      
      val df = sc.parallelize(Array(10,2,3,4)).toDF("steps")
      df.select(col("steps")).rdd.map(_(0).asInstanceOf[Int]).reduce(_+_)
      
      //res1 Int = 19
      

      【讨论】:

      • 不错的选择!如果他想要许多列的总和,效率会更高吗?在数据框中,我知道它会像df.agg(sum("col1"), sum("col2"), ...)
      • @DanieldePaula 我知道,但他说一栏
      • 哦,我读到“我想对每一列的值求和 (...)”,我认为他的意思是很多列。无论如何,我的问题更多是出于好奇,以帮助改进我们的答案。
      • @DanieldePaula 确实你的答案是正确的,我的只是一个替代方案(仅用于一列),所以我会投票给你的。
      • 我将第二个设置为正确答案,因为我想要一列值的总和。但是后来我需要平均值和其他统计方法,所以我想我会根据答案 1 使用类似的语法。
      【解决方案3】:

      只需应用聚合函数,Sum 在您的列上

      df.groupby('steps').sum().show()
      

      关注文档http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html

      也可以查看此链接https://www.analyticsvidhya.com/blog/2016/10/spark-dataframe-and-operations/

      【讨论】:

        【解决方案4】:

        当被问到这个问题时不确定这是否存在,但是:

        df.describe().show("columnName")
        

        在列上给出均值、计数、stdtev 统计信息。我认为如果你只是做.show()

        ,它会返回所有列

        【讨论】:

          【解决方案5】:

          使用 spark sql 查询..如果它可以帮助任何人!

          import org.apache.spark.sql.SparkSession 
          import org.apache.spark.SparkConf 
          import org.apache.spark.sql.functions._ 
          import org.apache.spark.SparkContext 
          import java.util.stream.Collectors
          
          val conf = new SparkConf().setMaster("local[2]").setAppName("test")
          val spark = SparkSession.builder.config(conf).getOrCreate()
          val df = spark.sparkContext.parallelize(Seq(1, 2, 3, 4, 5, 6, 7)).toDF()
          
          df.createOrReplaceTempView("steps")
          val sum = spark.sql("select  sum(steps) as stepsSum from steps").map(row => row.getAs("stepsSum").asInstanceOf[Long]).collect()(0)
          println("steps sum = " + sum) //prints 28
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-22
            • 1970-01-01
            • 1970-01-01
            • 2018-11-01
            • 1970-01-01
            • 2022-01-04
            • 2017-11-03
            相关资源
            最近更新 更多