Как суммировать значения одного столбца кадра данных в искровой /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()
Ответ 3
Просто примените функцию агрегации, Сумма в столбце
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
Используя иск 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)