it-swarm.com.de

Wie summiert man die Werte einer Spalte eines Datenrahmens in spark/scala?

Ich habe ein Dataframe, das ich aus einer CSV-Datei mit vielen Spalten gelesen habe: Zeitstempel, Schritte, Herzfrequenz usw.

Ich möchte die Werte jeder Spalte zusammenfassen, zum Beispiel die Gesamtzahl der Schritte in der Spalte "Schritte".

Soweit ich sehe, möchte ich diese Art von Funktionen verwenden: http://spark.Apache.org/docs/latest/api/scala/index.html#org.Apache.spark.sql.functions $

Aber ich kann die Funktionssumme verstehen. 

Wenn ich folgendes schreibe:

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

die Funktionssumme kann nicht aufgelöst werden. 

Benutze ich die Funktionssumme falsch? Muss Ι zuerst die Funktionskarte verwendet werden? und wenn ja wie?

Ein einfaches Beispiel wäre sehr hilfreich! Ich habe kürzlich angefangen, Scala zu schreiben. 

17
Ectoras

Wenn Sie alle Werte einer Spalte sum möchten, ist es effizienter, DataFrames interne RDD und reduce zu verwenden.

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

Sie müssen zuerst die Funktionen importieren:

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

Dann können Sie sie wie folgt verwenden:

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

Sie können das Ergebnis bei Bedarf auch umsetzen:

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

Bearbeiten:

Bei mehreren Spalten (z. B. "col1", "col2", ...) können Sie alle Aggregationen gleichzeitig erhalten:

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

Edit2:

Für die dynamische Anwendung der Aggregationen stehen folgende Optionen zur Verfügung:

  • Auf alle numerischen Spalten gleichzeitig anwenden:
df.groupBy().sum()
  • Anwenden auf eine Liste mit numerischen Spaltennamen:
val columnNames = List("col1", "col2")
df.groupBy().sum(columnNames: _*)
  • Anwenden auf eine Liste numerischer Spaltennamen mit Aliasnamen und/oder Umwandlungen:
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

Wenden Sie einfach die Aggregationsfunktion Sum in Ihrer Spalte an

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

Folgen Sie der Dokumentation http://spark.Apache.org/docs/2.1.0/api/python/pyspark.sql.html

Schauen Sie sich diesen Link auch an https://www.analyticsvidhya.com/blog/2016/10/spark-dataframe-and-operations/

4
shankarj67

Nicht sicher, ob es sich um diese Frage handelte, aber:

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

gibt die Mittelwerte, die Anzahl und die Anzahl der Statistiken in einer Spalte an. Ich denke, es wird in allen Spalten angezeigt, wenn Sie nur .show() tun. 

0
Marcos

Mit spark sql query..just falls es jemandem hilft!

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
0
Omkar