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

Bry*_*ind 11 python sum dataframe pyspark

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

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "Number"])
Run Code Online (Sandbox Code Playgroud)

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

df.groupBy().sum()
Run Code Online (Sandbox Code Playgroud)

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

+-----------+
|sum(Number)|
+-----------+
|        130|
+-----------+
Run Code Online (Sandbox Code Playgroud)

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

result = 130
Run Code Online (Sandbox Code Playgroud)

LaS*_*Sul 18

如果你想要一个特定的列:

import pyspark.sql.functions as F     

df.agg(F.sum("my_column")).collect()[0][0]
Run Code Online (Sandbox Code Playgroud)


小智 16

我认为最简单的方法:

df.groupBy().sum().collect()
Run Code Online (Sandbox Code Playgroud)

将返回一个列表.在你的例子中:

In [9]: df.groupBy().sum().collect()[0][0]
Out[9]: 130
Run Code Online (Sandbox Code Playgroud)

  • 它如何理解哪一列要 groupBy 以及哪一列要 Sum ? (5认同)

Aro*_*los 10

真正最简单的方法:

df.groupBy().sum().collect()
Run Code Online (Sandbox Code Playgroud)

但操作非常慢:避免使用groupByKey,你应该使用RDD和reduceByKey:

df.rdd.map(lambda x: (1,x[1])).reduceByKey(lambda x,y: x + y).collect()[0][1]
Run Code Online (Sandbox Code Playgroud)

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

RDD和ReduceByKey:2.23 s

GroupByKey:30.5秒


Ali*_*AzG 6

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

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

result = sum_number["sum(Number)"]
Run Code Online (Sandbox Code Playgroud)