Python PySpark-对数据帧中的一列求和,并将结果返回为int

Python PySpark-对数据帧中的一列求和,并将结果返回为int,python,dataframe,sum,pyspark,Python,Dataframe,Sum,Pyspark,我有一个pyspark数据框,其中有一列数字。我需要对该列求和,然后将结果作为python变量中的int返回 df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"]) import pyspark.sql.functions as F df.groupBy().agg(F.sum('N

我有一个pyspark数据框,其中有一列数字。我需要对该列求和,然后将结果作为python变量中的int返回

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
我对该列进行以下汇总

df.groupBy().sum()
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
但我得到了一个数据帧

+-----------+
|sum(Number)|
+-----------+
|        130|
+-----------+
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
我将返回一个存储在变量中的int,以便在程序中的其他地方使用

result = 130
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

以下方面应起作用:

df.groupBy().sum().rdd.map(lambda x: x[0]).collect()
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

我认为最简单的方法是:

df.groupBy().sum().collect()
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
将返回一个列表。 在您的示例中:

In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

最简单的方法是:

df.groupBy().sum().collect()
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
但是它的操作非常慢:,您应该使用RDD和reduceByKey:

df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
我尝试了一个更大的数据集,并测量了处理时间:

import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
RDD和ReduceByKey:2.23秒

import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

GroupByKey:30.5s

这是另一种方法。使用
agg
collect

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

result = sum_number["sum(Number)"]
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

有时将csv文件读取到pyspark Dataframe,可能数字列更改为字符串类型“23”,如下图所示,您应该使用pyspark.sql.functions.sum将结果获取为int,而不是sum()

import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()

如果需要特定列,请执行以下操作:

import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
import pyspark.sql.functions as F     

df.agg(F.sum("my_column")).collect()[0][0]

您也可以尝试使用
first()
函数。它返回数据帧的第一行,您可以使用索引访问各个列的值

import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()
df.groupBy().sum().first()[0]

在您的例子中,结果是一个具有单行和列的数据帧,因此上面的代码段可以工作。

函数将返回一个数据帧,我只需要int值。哦,是的,没有看到详细信息,抱歉。我现在已经修改了一个列表,它是如何理解哪些列要分组,哪些列要求和的?
import pyspark.sql.functions as F                                                    
df.groupBy().agg(F.sum('Number')).show()