Как суммировать значения одного столбца кадра данных в искровой /scala

У меня есть Dataframe, который я читал из файла CSV со многими столбцами, такими как: timestamp, steps, heartrate и т.д.

Я хочу суммировать значения каждого столбца, например, общее количество шагов в столбце "шаги".

Насколько я вижу, я хочу использовать такие функции: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions$

Но я могу понять, как использовать сумму функций.

Когда я пишу следующее:

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

сумма функции не может быть решена.

Я неправильно использую сумму функции? Нужно ли сначала использовать карту функций? и если да, то как?

Простой пример был бы очень полезен! Недавно я начал писать "Scala".

Ответ 1

Если вы хотите sum все значения одного столбца, более эффективно использовать внутренний RDD DataFrame и reduce.

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

Ответ 2

Вы должны сначала импортировать функции:

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:

Для динамического применения агрегатов доступны следующие параметры:

  • Применение ко всем числовым столбцам сразу:
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()

Ответ 4

Не уверен, что это было, когда этот вопрос был задан, но:

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

дает среднее значение, считать, stdtev статистики по столбцу. Я думаю, что он возвращает все столбцы, если вы просто делаете .show()

Ответ 5

Используя иск 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 = CSV.load(args(0))
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)