如何在spark/scala中对数据帧的一列的值求和

如何在spark/scala中对数据帧的一列的值求和,scala,apache-spark,Scala,Apache Spark,我有一个从CSV文件中读取的数据框,其中有很多列,如:时间戳、步长、心率等 我想对每列的值求和,例如“步骤”列上的步骤总数 据我所知,我想使用这些函数: 但我能理解如何使用sum函数 当我写下以下内容时: val df = CSV.load(args(0)) val sumSteps = df.sum("steps") 无法解析函数和 我是否错误地使用了sum函数? 我是否需要先使用函数映射?如果是,怎么做 一个简单的例子将非常有用!我最近开始写Scala 必须首先导入函数: import

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

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

据我所知,我想使用这些函数:

但我能理解如何使用sum函数

当我写下以下内容时:

val df = CSV.load(args(0))
val sumSteps = df.sum("steps") 
无法解析函数和

我是否错误地使用了sum函数? 我是否需要先使用函数映射?如果是,怎么做


一个简单的例子将非常有用!我最近开始写Scala

必须首先导入函数:

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
Edit2:

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

  • 一次应用于所有数字列:
  • 应用于数字列名列表:
val columnNames=List(“col1”、“col2”)
df.groupBy()
  • 应用于具有别名和/或强制转换的数字列名列表:
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()

如果您想对一列的所有值进行
求和
,使用
数据帧
的内部
RDD
减少
会更有效

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

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

df.groupby('steps').sum().show()
遵循文档


也请查看此链接

不确定询问此问题时是否存在此问题,但:

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

给出列上的平均值、计数、stdtev统计信息。我认为,如果您使用spark sql query执行
.show()

操作,它会在所有列上返回。如果它对任何人都有帮助,请以防万一

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

不错的选择!如果他想要许多列的总和,效率还会更高吗?在一个数据帧中,我知道它会像
df.agg(sum(“col1”)、sum(“col2”)、…)
@danieldbola我知道,但他说有一列哦,我读到“我想对每列的值求和(…)”,我想他指的是很多列。无论如何,我的问题更多的是出于好奇,以帮助改进我们的答案。@DanieldaPaula事实上,你的答案是正确的,我的答案只是一个备选答案(只针对一列),因此我将投你的票。我将第二个答案设置为正确答案,因为我想要一列值的总和。但是稍后我需要均值和其他统计方法,所以我想我会在回答1的基础上使用类似的语法。
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