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
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
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
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)"]