web-dev-qa-db-fra.com

Additionner plusieurs colonnes dans Spark

Comment additionner plusieurs colonnes dans Spark? Par exemple, dans SparkR, le code suivant fonctionne pour obtenir la somme d'une colonne, mais si j'essaye d'obtenir la somme des deux colonnes dans df, j'obtiens une erreur.

# Create SparkDataFrame
df <- createDataFrame(faithful)

# Use agg to sum total waiting times
head(agg(df, totalWaiting = sum(df$waiting)))
##This works

# Use agg to sum total of waiting and eruptions
head(agg(df, total = sum(df$waiting, df$eruptions)))
##This doesn't work

Le code SparkR ou PySpark fonctionnera.

6
Gaurav Bansal
org.Apache.spark.sql.functions.sum(Column e)

Fonction d'agrégation: renvoie la somme de toutes les valeurs de l'expression.

Comme vous pouvez le voir, sum ne prend qu'une seule colonne en entrée, donc sum(df$waiting, df$eruptions) ne fonctionnera pas. Puisque vous voulez résumer les champs numériques, vous pouvez fairesum(df("waiting") + df("eruptions")). Si vous wan pour résumer les valeurs des colonnes individuelles, vous pouvez df.agg(sum(df$waiting),sum(df$eruptions)).show

3
Balaji Devaraj

Pour PySpark, si vous ne voulez pas taper explicitement les colonnes:

from operator import add
from functools import reduce
new_df = df.withColumn('total',reduce(add, [F.col(x) for x in numeric_col_list]))
11
user2010808

vous pouvez faire quelque chose comme ci-dessous dans pyspark

>>> from pyspark.sql import functions as F
>>> df = spark.createDataFrame([("a",1,10), ("b",2,20), ("c",3,30), ("d",4,40)], ["col1", "col2", "col3"])
>>> df.groupBy("col1").agg(F.sum(df.col2+df.col3)).show()
+----+------------------+
|col1|sum((col2 + col3))|
+----+------------------+
|   d|                44|
|   c|                33|
|   b|                22|
|   a|                11|
+----+------------------+
2
rogue-one

code sparkR:

library(SparkR)
df <- createDataFrame(sqlContext,faithful)
w<-agg(df,sum(df$waiting)),agg(df,sum(df$eruptions))
head(w[[1]])
head(w[[2]])
1
midhunxavier