Es gibt mehrere Möglichkeiten, Aggregatfunktionen auf mehrere Spalten anzuwenden.
GroupedData
Klasse bietet eine Anzahl von Methoden für die am häufigsten verwendeten Funktionen, einschließlich der count
, max
, min
, mean
und sum
, die direkt folgt , wie verwendet werden können:
Python:
df = sqlContext.createDataFrame(
[(1.0, 0.3, 1.0), (1.0, 0.5, 0.0), (-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2)],
("col1", "col2", "col3"))
df.groupBy("col1").sum()
Scala
val df = sc.parallelize(Seq(
(1.0, 0.3, 1.0), (1.0, 0.5, 0.0),
(-1.0, 0.6, 0.5), (-1.0, 5.6, 0.2))
).toDF("col1", "col2", "col3")
df.groupBy($"col1").min().show
Optional können Sie eine Liste von Spalten übergeben, die aggregiert werden sollen
df.groupBy("col1").sum("col2", "col3")
Sie können auch ein Wörterbuch / eine Karte mit Spalten und den Schlüsseln übergeben und fungieren als Werte:
Schließlich können Sie varargs verwenden:
Python
from pyspark.sql.functions import min
exprs = [min(x) for x in df.columns]
df.groupBy("col1").agg(*exprs).show()
Scala
import org.apache.spark.sql.functions.sum
val exprs = df.columns.map(sum(_))
df.groupBy($"col1").agg(exprs.head, exprs.tail: _*)
Es gibt andere Möglichkeiten, um einen ähnlichen Effekt zu erzielen, aber diese sollten die meiste Zeit mehr als ausreichend sein.
Siehe auch:
aggregateBy
hier anwendbar zu sein. Es ist schneller (zu viel schneller) alsgroupBy
. Oh warte - dasDataFrame
macht nicht ausaggregateBy
-agg
wird darauf hingewiesengroupBy
. Nun, das heißt,DataFrames
sind langsam ..Dataset.groupBy
/Dataset.groupByKey
undRDD.groupBy
/RDD.groupByKey
im Allgemeinen unterschiedliche Semantiken haben. Überprüfen Sie dies bei einfachenDataFrame
Aggregationen . Das ist mehr, aber es ist hier nicht wichtig.exprs = [min(x).alias("{0}".format(x)) for x in df.columns]
Ein weiteres Beispiel für dasselbe Konzept - aber sagen wir - Sie haben zwei verschiedene Spalten - und Sie möchten auf jede von ihnen unterschiedliche Agg-Funktionen anwenden, d. H.
Hier ist der Weg, um dies zu erreichen - obwohl ich noch nicht weiß, wie ich den Alias in diesem Fall hinzufügen soll
Siehe das folgende Beispiel - Verwenden von Karten
quelle
Aktuelle Antworten zum Erstellen der Aggregationen sind vollkommen korrekt, aber keine adressiert tatsächlich den Spaltenalias / die Umbenennung, der / die ebenfalls in der Frage angefordert wird.
Normalerweise gehe ich so mit diesem Fall um:
In der letzten Zeile werden im Wesentlichen alle Spalten des aggregierten Datenrahmens in die ursprünglichen Felder umbenannt, wobei im Wesentlichen geändert wird
sum(col2)
undsum(col3)
einfachcol2
undcol3
.quelle