PySpark - 在数据帧中对一列进行求和,并将结果作为int返回

时间:2017-12-14 11:43:06

标签: python dataframe sum pyspark

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

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

我执行以下操作来对列进行求和。

df.groupBy().sum()

但是我得到了一个数据帧。

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

我将130作为存储在变量中的int返回,以便在程序中使用。

result = 130

7 个答案:

答案 0 :(得分:12)

我认为最简单的方法:

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

将返回一个列表。 在您的示例中:

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

答案 1 :(得分:6)

最简单的方法:

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

但是操作非常缓慢:Avoid groupByKey,您应该使用RDD和reduceByKey:

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

我尝试使用更大的数据集,并测量了处理时间:

RDD和ReduceByKey: 2.23 s

GroupByKey:30.5秒

答案 2 :(得分:4)

这是您可以执行此操作的另一种方法。使用aggcollect

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

result = sum_number["sum(Number)"]

答案 3 :(得分:1)

如果要特定列:

import pyspark.sql.functions as F     

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

答案 4 :(得分:0)

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

df.groupBy().sum().first()[0]

在您的情况下,结果是具有单行和单列的数据框,因此上述代码段有效。

答案 5 :(得分:-1)

以下内容应该有效:

df.groupBy().sum().rdd.map(lambda x: x[0]).collect()

答案 6 :(得分:-1)

有时将一个csv文件读取到pyspark Dataframe,也许数字列更改为字符串类型'23',这样,您应该使用pyspark.sql.functions.sum将结果作为int而不是sum()

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