web-dev-qa-db-fra.com

PySpark - Somme une colonne dans dataframe et renvoie les résultats sous forme d'int

J'ai un dataframe pyspark avec une colonne de nombres. Je dois faire la somme de cette colonne et ensuite renvoyer le résultat en tant qu'int dans une variable python. 

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])

Je fais ce qui suit pour résumer la colonne. 

df.groupBy().sum()

Mais je récupère une base de données. 

+-----------+
|sum(Number)|
+-----------+
|        130|
+-----------+

Je voudrais 130 retourné comme un int stocké dans une variable pour être utilisé sinon où dans le programme. 

result = 130
6
Bryce Ramgovind

Je pense que le moyen le plus simple:

df.groupBy().sum().collect()

retournera une liste . Dans votre exemple:

In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
11

Le moyen le plus simple vraiment: 

df.groupBy().sum().collect()

Mais c’est une opération très lente: Evitez groupByKey , vous devez utiliser RDD et reductionByKey: 

df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]

J'ai essayé sur un plus grand ensemble de données et j'ai mesuré le temps de traitement: 

RDD et ReduceByKey: 2.23 s

GroupByKey: 30.5 s

5
Aron Asztalos

C'est une autre façon de faire cela. en utilisant agg et collect:

sum_number = df.agg({"Number":"sum"}).collect()[0]

result = sum_number["sum(Number)"]
2
Ali AzG