web-dev-qa-db-fra.com

Comment additionner les valeurs d'une colonne d'un dataframe dans spark/scala

J'ai une Dataframe que je lis à partir d'un fichier CSV avec de nombreuses colonnes comme: timestamp, steps, Heartrate etc.

Je veux additionner les valeurs de chaque colonne, par exemple le nombre total d'étapes sur la colonne "étapes".

Pour autant que je sache, je souhaite utiliser ce type de fonctions: http://spark.Apache.org/docs/latest/api/scala/index.html#org.Apache.spark.sql.functions $

Mais je peux comprendre comment utiliser la somme de fonctions. 

Quand j'écris ce qui suit:

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

la somme des fonctions ne peut pas être résolue. 

Est-ce que j'utilise mal la fonction sum? Faut-il d'abord utiliser la carte des fonctions? et si oui comment?

Un exemple simple serait très utile! J'ai commencé à écrire Scala récemment. 

17
Ectoras

Si vous voulez sum toutes les valeurs d'une colonne, il est plus efficace d'utiliser les variables internes DataFrameRDD et 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
15

Vous devez d'abord importer les fonctions:

import org.Apache.spark.sql.functions._

Ensuite, vous pouvez les utiliser comme ceci:

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

Vous pouvez également lancer le résultat si nécessaire:

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

Modifier:

Pour plusieurs colonnes (par exemple "col1", "col2", ...), vous pouvez obtenir toutes les agrégations à la fois:

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

Edit2:

Pour appliquer dynamiquement les agrégations, les options suivantes sont disponibles:

  • Appliquer à toutes les colonnes numériques à la fois:
df.groupBy().sum()
  • Application à une liste de noms de colonnes numériques:
val columnNames = List("col1", "col2")
df.groupBy().sum(columnNames: _*)
  • Application à une liste de noms de colonnes numériques avec alias et/ou transts:
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()
70
Daniel de Paula

Appliquez simplement la fonction d'agrégation, Sum sur votre colonne

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

Suivez la documentation http://spark.Apache.org/docs/2.1.0/api/python/pyspark.sql.html

Découvrez également ce lien https://www.analyticsvidhya.com/blog/2016/10/spark-dataframe-and-operations/

4
shankarj67

Je ne suis pas sûr que c'était à ce moment-là que cette question a été posée, mais:

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

donne les statistiques moyennes, comptées, stdtev sur une colonne. Je pense que cela revient sur toutes les colonnes si vous ne faites que .show() 

0
Marcos